首页编程java编程java 对象反射的作用是什么意思 怎么理解Java中的反射,作用是什么

java 对象反射的作用是什么意思 怎么理解Java中的反射,作用是什么

编程之家 2023-10-13 76次浏览

很多朋友对于java 对象反射的作用是什么意思和怎么理解Java中的反射,作用是什么不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

java 对象反射的作用是什么意思 怎么理解Java中的反射,作用是什么

java中的反射机制是什么有什么作用呢求解,谢谢。

Java反射机制详解

1.反射机制是什么

反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

2.反射机制能做什么

java 对象反射的作用是什么意思 怎么理解Java中的反射,作用是什么

反射机制主要提供了以下功能:

在运行时判断任意一个对象所属的类;

在运行时构造任意一个类的对象;

java 对象反射的作用是什么意思 怎么理解Java中的反射,作用是什么

在运行时判断任意一个类所具有的成员变量和方法;

在运行时调用任意一个对象的方法;

生成动态代理。

3.反射机制的相关API

通过一个对象获得完整的包名和类名

packagenet.xsoftlab.baike;

publicclassTestReflect{

publicstaticvoidmain(String[]args)throwsException{

TestReflecttestReflect=newTestReflect();

System.out.println(testReflect.getClass().getName());

//结果net.xsoftlab.baike.TestReflect

}

}

实例化Class类对象

packagenet.xsoftlab.baike;

publicclassTestReflect{

publicstaticvoidmain(String[]args)throwsException{

Class<?>class1=null;

Class<?>class2=null;

Class<?>class3=null;

//一般采用这种形式

class1=Class.forName("net.xsoftlab.baike.TestReflect");

class2=newTestReflect().getClass();

class3=TestReflect.class;

System.out.println("类名称"+class1.getName());

System.out.println("类名称"+class2.getName());

System.out.println("类名称"+class3.getName());

}

}

获取一个对象的父类与实现的接口

packagenet.xsoftlab.baike;

importjava.io.Serializable;

publicclassTestReflectimplementsSerializable{

privatestaticfinallongserialVersionUID=-2862585049955236662L;

publicstaticvoidmain(String[]args)throwsException{

Class<?>clazz=Class.forName("net.xsoftlab.baike.TestReflect");

//取得父类

Class<?>parentClass=clazz.getSuperclass();

System.out.println("clazz的父类为:"+parentClass.getName());

//clazz的父类为:java.lang.Object

//获取所有的接口

Class<?>intes[]=clazz.getInterfaces();

System.out.println("clazz实现的接口有:");

for(inti=0;i<intes.length;i++){

System.out.println((i+1)+":"+intes[i].getName());

}

//clazz实现的接口有:

//1:java.io.Serializable

}

}

获取某个类中的全部构造函数-详见下例

通过反射机制实例化一个类的对象

packagenet.xsoftlab.baike;

importjava.lang.reflect.Constructor;

publicclassTestReflect{

publicstaticvoidmain(String[]args)throwsException{

Class<?>class1=null;

class1=Class.forName("net.xsoftlab.baike.User");

//第一种方法,实例化默认构造方法,调用set赋值

Useruser=(User)class1.newInstance();

user.setAge(20);

user.setName("Rollen");

System.out.println(user);

//结果User[age=20,name=Rollen]

//第二种方法取得全部的构造函数使用构造函数赋值

Constructor<?>cons[]=class1.getConstructors();

//查看每个构造方法需要的参数

for(inti=0;i<cons.length;i++){

Class<?>clazzs[]=cons[i].getParameterTypes();

System.out.print("cons["+i+"](");

for(intj=0;j<clazzs.length;j++){

if(j==clazzs.length-1)

System.out.print(clazzs[j].getName());

else

System.out.print(clazzs[j].getName()+",");

}

System.out.println(")");

}

//结果

//cons[0](java.lang.String)

//cons[1](int,java.lang.String)

//cons[2]()

user=(User)cons[0].newInstance("Rollen");

System.out.println(user);

//结果User[age=0,name=Rollen]

user=(User)cons[1].newInstance(20,"Rollen");

System.out.println(user);

//结果User[age=20,name=Rollen]

}

}

classUser{

privateintage;

privateStringname;

publicUser(){

super();

}

publicUser(Stringname){

super();

this.name=name;

}

publicUser(intage,Stringname){

super();

this.age=age;

this.name=name;

}

publicintgetAge(){

returnage;

}

publicvoidsetAge(intage){

this.age=age;

}

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

this.name=name;

}

@Override

publicStringtoString(){

return"User[age="+age+",name="+name+"]";

}

}

获取某个类的全部属性

packagenet.xsoftlab.baike;

importjava.io.Serializable;

importjava.lang.reflect.Field;

importjava.lang.reflect.Modifier;

publicclassTestReflectimplementsSerializable{

privatestaticfinallongserialVersionUID=-2862585049955236662L;

publicstaticvoidmain(String[]args)throwsException{

Class<?>clazz=Class.forName("net.xsoftlab.baike.TestReflect");

System.out.println("===============本类属性===============");

//取得本类的全部属性

Field[]field=clazz.getDeclaredFields();

for(inti=0;i<field.length;i++){

//权限修饰符

intmo=field[i].getModifiers();

Stringpriv=Modifier.toString(mo);

//属性类型

Class<?>type=field[i].getType();

System.out.println(priv+""+type.getName()+""+field[i].getName()+";");

}

System.out.println("==========实现的接口或者父类的属性==========");

//取得实现的接口或者父类的属性

Field[]filed1=clazz.getFields();

for(intj=0;j<filed1.length;j++){

//权限修饰符

intmo=filed1[j].getModifiers();

Stringpriv=Modifier.toString(mo);

//属性类型

Class<?>type=filed1[j].getType();

System.out.println(priv+""+type.getName()+""+filed1[j].getName()+";");

}

}

}

通过反射机制调用某个类的方法

packagenet.xsoftlab.baike;

importjava.lang.reflect.Method;

publicclassTestReflect{

publicstaticvoidmain(String[]args)throwsException{

Class<?>clazz=Class.forName("net.xsoftlab.baike.TestReflect");

//调用TestReflect类中的reflect1方法

Methodmethod=clazz.getMethod("reflect1");

method.invoke(clazz.newInstance());

//Java反射机制-调用某个类的方法1.

//调用TestReflect的reflect2方法

method=clazz.getMethod("reflect2",int.class,String.class);

method.invoke(clazz.newInstance(),20,"张三");

//Java反射机制-调用某个类的方法2.

//age->20.name->张三

}

publicvoidreflect1(){

System.out.println("Java反射机制-调用某个类的方法1.");

}

publicvoidreflect2(intage,Stringname){

System.out.println("Java反射机制-调用某个类的方法2.");

System.out.println("age->"+age+".name->"+name);

}

}

通过反射机制操作某个类的属性

packagenet.xsoftlab.baike;

importjava.lang.reflect.Field;

publicclassTestReflect{

privateStringproprety=null;

publicstaticvoidmain(String[]args)throwsException{

Class<?>clazz=Class.forName("net.xsoftlab.baike.TestReflect");

Objectobj=clazz.newInstance();

//可以直接对private的属性赋值

Fieldfield=clazz.getDeclaredField("proprety");

field.setAccessible(true);

field.set(obj,"Java反射机制");

System.out.println(field.get(obj));

}

}

4.反射机制的应用实例

在泛型为Integer的ArrayList中存放一个String类型的对象。

packagenet.xsoftlab.baike;

importjava.lang.reflect.Method;

importjava.util.ArrayList;

publicclassTestReflect{

publicstaticvoidmain(String[]args)throwsException{

ArrayList<Integer>list=newArrayList<Integer>();

Methodmethod=list.getClass().getMethod("add",Object.class);

method.invoke(list,"Java反射机制实例。");

System.out.println(list.get(0));

}

}

通过反射取得并修改数组的信息

packagenet.xsoftlab.baike;

importjava.lang.reflect.Array;

publicclassTestReflect{

publicstaticvoidmain(String[]args)throwsException{

int[]temp={1,2,3,4,5};

Class<?>demo=temp.getClass().getComponentType();

System.out.println("数组类型:"+demo.getName());

System.out.println("数组长度"+Array.getLength(temp));

System.out.println("数组的第一个元素:"+Array.get(temp,0));

Array.set(temp,0,100);

System.out.println("修改之后数组第一个元素为:"+Array.get(temp,0));

}

}

将反射机制应用于工厂模式

packagenet.xsoftlab.baike;

interfacefruit{

publicabstractvoideat();

}

classAppleimplementsfruit{

publicvoideat(){

System.out.println("Apple");

}

}

classOrangeimplementsfruit{

publicvoideat(){

System.out.println("Orange");

}

}

classFactory{

publicstaticfruitgetInstance(StringClassName){

fruitf=null;

try{

f=(fruit)Class.forName(ClassName).newInstance();

}catch(Exceptione){

e.printStackTrace();

}

returnf;

}

}

/**

*对于普通的工厂模式当我们在添加一个子类的时候,就需要对应的修改工厂类。当我们添加很多的子类的时候,会很麻烦。

*Java工厂模式可以参考

*http://baike.xsoftlab.net/view/java-factory-pattern

*

*现在我们利用反射机制实现工厂模式,可以在不修改工厂类的情况下添加任意多个子类。

*

*但是有一点仍然很麻烦,就是需要知道完整的包名和类名,这里可以使用properties配置文件来完成。

*

*java读取properties配置文件的方法可以参考

*http://baike.xsoftlab.net/view/java-read-the-properties-configuration-file

*

*@authorxsoftlab.net

*/

publicclassTestReflect{

publicstaticvoidmain(String[]args)throwsException{

fruitf=Factory.getInstance("net.xsoftlab.baike.Apple");

if(f!=null){

f.eat();

}

}

}

我有一个微信公众号,经常会分享一些Java技术相关的干货,还有一些学习资源。

如果你喜欢我的分享,可以用微信搜索“Java团长”或者“javatuanzhang”关注。

怎么理解Java中的反射,作用是什么

反射是审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等.

反射的主要作用是用来扩展系统和动态调用程序集。

所谓扩展系统就是先把系统写好,系统里面定义接口,后面开发的人去写接口的代码。

此时该系统就要用反射了,系统用反射调用接口,当接口没写,系统利用反射就不会不会出错,此时就等于没实现此功能而已,当接口被人写好了,系统就会自动调用接口的功能展现在系统上。

即反射实现即插即用功能。

动态调用程序集就是利用反射去调用编译好的dll,当然此时的dll没有被引用到你所建的工程里面。

当你编译你的工程时,不会编译你调用的dll,当你运行到调用dll时,此时才会去调用dll,判断是否有语法语义,等编译,运行的错误。

这样利用反射具有一定灵活性,就是不用从你的工程调用dll,还有就是dll可随时改变(当然接口还是要对应),不需改变你所建的工程。

总之反射最好的好处就是新建工程时后不须一定要写好dll,可新建完工程后,后期写dll也可以。即所谓后期绑定。当然利用反射是耗资源的,损失效率,如果不是在上面的场合利用此技术,可能不会带来好处,反而是坏处。

java中的反射机制是什么,有什么作用啊

Method类中的方法的使用(含代码和注释):

getMethods()获得本类及父类中的public权限修饰**符方法

getDeclaredMethods()专门获得调用该方法的对象的本类中的所有方法包括private权限修饰符**的方法

getDeclaredMethod(Stringname,class<?>...parameterTypes)

第一个参数:方法的名称

第二个参数:可变长度,写你要查找的那个方法的参数类型列表.class

getParameterCount()得到方法的参数个数123456

packageLessonForReflection03;importjava.lang.reflect.Method;importjava.lang.reflect.Modifier;abstractclassCard{

privatevoidcreatRandomNumbers(intcount)//private关键字

{

}

publicvoidgetFullCardsNumbers(String[]random,Stringpre_numbers)

{

}

publicstaticvoidgetUserInfor()

{

}

publicabstractvoidgetUserInfor(Stringtel);

publicabstractvoidgetUserInfor(intsal1,intsal2)throwsArrayIndexOutOfBoundsException,ArithmeticException;}publicclassMethodInforGetter{

publicstaticvoidmain(String[]args)

{

Class<?>c1=Card.class;

System.out.println("-------------------------");

Method[]m1=c1.getMethods();//getMethods()获得本类及父类中的public方法!

for(Methodm:m1)

{

System.out.println(m);

}

System.out.println("-------------------------");

Method[]m2=c1.getDeclaredMethods();//getDeclaredMethods()专门获得本类中的所有方法包括private!

for(Methodm:m2)

{

System.out.println(m);

}

System.out.println("-------------------------");

/*

*getDeclaredMethod(Stringname,class<?>...parameterTypes)

*第一个参数:方法的名称

*第二个参数:可变长度,写你要查找的那个方法的参数类型列表

*

*getParameterCount()得到方法的参数个数

*/

try

{

Methodm3=c1.getDeclaredMethod("getUserInfor");

System.out.println(m3);

//getParameterCount()方法,获得方法参数个数

System.out.println(m3.getParameterCount());

System.out.println(Modifier.toString(m3.getModifiers()));//获得方法修饰符

System.out.println(m3.getReturnType());

System.out.println("-------------------------");

Methodm4=c1.getDeclaredMethod("getUserInfor",int.class,int.class);

//getExceptionTypes()可以获得初始化当前Method对象的给Class对象初始化的那个类的那个指定方法抛出的异常类型

Class<?>[]exception=m4.getExceptionTypes();

for(Class<?>e:exception)

{

System.out.println(e);

}

}catch(NoSuchMethodException|SecurityExceptione)

{

e.printStackTrace();

}

}}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788

Constructor类中的方法的使用www.xiaoyuani.com(含代码和注释):

java.lang.reflect.Constructor:

Constructor[]getConstructor()获得本类里的public权限修饰符构造函数,不能获取父类的!

Constructor[]getDeclaredConstructor()获得本类中的所以构造函数!

Constructor<T>getConstructor(Class...parameterType)用参数决定获得本类中的某个的构造方法,只能获得public的

Constructor<T>getDeclaredConstructor(Class...parameterType)用参数决定获得本类中的某个构造方法

附:

JDK8.0之后新增的类:

Executable:

它是Method和Constructor的父类

常用方法:

getParameter()获得类中方法参数

getExceptionTypes()获得类中某个方法抛出异常类型

getMoidfiers()获得方法权限修饰符

Parameter:

封装并代表了参数实例123456789101112131415

packageLessonForReflection03;importjava.lang.reflect.Constructor;importjava.lang.reflect.Modifier;importjava.lang.reflect.Parameter;/*

*java.lang.reflect.Constructor

*

*Constructor[]getConstructor();获得本类里的public权限修饰符构造函数,不能获取父类的

*Constructor[]getDeclaredConstructor();得本类里的全部构造

*

*Constructor<T>getConstructor(Class...parameterType);用参数决定获得哪个构造方法

*Constructor<T>getDeclaredConstructor(Class...parameterType);

*

*/publicclassConstructorInforGetter{

publicstaticvoidmain(String[]args)

{

System.out.println("获得Cricle本类里的public权限修饰符构造函数,不能获取父类的Constructor[]getConstructor()");

System.out.println("子类继承不了父类中的构造方法和private");

//Constructor[]getConstructor()获得Cricle本类里的public权限修饰符构造函数,不能获取父类的

//子类继承不了父类中的构造方法和private

Class<Circle>c1=Circle.class;

Constructor<?>[]cons1=c1.getConstructors();

for(Constructor<?>cons:cons1)

{

System.out.println(cons);

//System.out.println(cons.getName());

}

System.out.println("-----------------------");

System.out.println("方法获得本类中的所有构造函数getDeclaredConstructor()");

Constructor<?>[]cons2=c1.getDeclaredConstructors();

for(Constructor<?>cons:cons2)

{

System.out.println(cons);

}

System.out.println("-----------------------");

try

{

System.out.println("方法用参数指定获得本类!构造方法,只能获取public的Constructor<T>getConstructor(Class...parameterType)");

Constructor<?>cons3=c1.getConstructor(int.class);

System.out.println(Modifier.toString(cons3.getModifiers()));

System.out.println(cons3);

System.out.println("-----------------------");

System.out.println("方法用参数指定获得本类!构造方法任何权限修饰符的都可以获得Constructor<T>getDeclaredConstructor(Class...parameterType)");

Constructor<?>cons4=c1.getDeclaredConstructor(String.class);

System.out.println(cons4);

System.out.println("-----------------------");

/*

*JDK8.0之后新增的类

*Executable:

*是Method和Constructor的父类

*方法:

*getParameter();

*getExceptionTypes();

*getModifiers();

*getTypeParameters();

*

*Parameter:

*封装并代表了参数实例

*/

System.out.println("获取类中方法的参数getParameters()");

Constructor<?>cons5=c1.getDeclaredConstructor(int.class,String.class);

Parameter[]p1=cons5.getParameters();

for(Parameterp:p1)

{

System.out.println(p);

}

}catch(NoSuchMethodException|SecurityExceptione)

{

e.printStackTrace();

}

}}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687

代码中提到的Circle类和Shape类二者为继承关系:

packageLessonForReflection03;publicclassCircleextendsShape{

privateintr;

privateStringcolor;

publicCircle(intr,Stringcolor)

{

super();

this.r=r;

this.color=color;

}

publicCircle(intr)

{

super();

this.r=r;

}

protectedCircle(Stringcolor)

{

super();

this.color=color;

}

Circle()

{

super();

}}12345678910111213141516171819202122232425262728293031

packageLessonForReflection03;publicclassShape{

privateintper;

publicShape(intper)

{

super();

this.per=per;

}

publicShape()

{

super();

}}1234567891011121314151617

部分文字来源于:

咕嘟咖啡杨海滨老师—《java编程语言高级特性》

轻量化研习Java相关技术倡导者

“爱码学院”联合创始人自适应教学理念提出者践行者;多年开发及项目管理经历;出版《JavaEE企业级应用与开发》一书;10余年高校项目实践毕设指导经验;企业软培经验丰富

好了,关于java 对象反射的作用是什么意思和怎么理解Java中的反射,作用是什么的问题到这里结束啦,希望可以解决您的问题哈!

java中dao是什么意思?java中的Dao类是什么意思 java cl什么意思 java tea是一种什么茶