今天宠物迷的小编给各位宠物饲养爱好者分享java 反射机制的作用的宠物知识,其中也会对java反射有哪些用途?????(java反射的用途)进行专业的解释,如果能碰巧解决你现在面临的宠物相关问题,别忘了关注本站哦,现在我们开始吧!
j2ee中的其他组建,JAVA的反射是指,可以通过一个类名来探察这个类里面的信息,比如说类的属性名,属性名的修饰符,方法名,方法返回值,方法修饰符等等,反正除了方法体得不到,其他都可以用反射得到;反射还可以生成类的实例,通过这个实例定义属性,调用方法,特别是能调用私有的属性和私有的方法。
Object obj = Class.forName("").newInstance();
public void invokeMethod(Object obj, String methodName, Object[] param)
throws Exception {
Class clazz = obj.getClass();
Class[] classArgs = new Class[param.length];
for (int i = 0; i < param.length; i++) {
classArgs[i] = param[i].getClass();
}
Method method = clazz.getMethod(methodName, classArgs);
method.invoke(obj, param);
}
增加程序的灵活性。
如struts中。请求的派发控制。
当请求来到时。struts通过查询配置文件。找到该请求对应的action。已经方法。
然后通过反射实例化action。并调用响应method。
如果不适用反射,那么你就只能写死到代码里了。
所以说,一个灵活,一个不灵活。
很少情况下是非用反射不可的。大多数情况下反射是为了提高程序的灵活性。
因此一般框架中使用较多。因为框架要适用更多的情况。对灵活性要求较高。
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的不同技术与作法。我们朗朗上口动态绑定(dynamic binding)、动态链接(dynamic linking)、动态加载(dynamic loading)等。然而“动态”一词其实没有绝对而普遍适用的严格定义,有时候甚至像面向对象当初被导入编程领域一样,一人一把号,各吹各的调。
一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。
尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。这种“看透class”的能力(the ability of the program to examine itself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语。
Java如何能够做出上述的动态特性呢?这是一个深远话题,本文对此只简单介绍一些概念。整个篇幅最主要还是介绍Reflection APIs,也就是让读者知道如何探索class的结构、如何对某个“运行时才获知名称的class”生成一份实体、为其fields设值、调用其methods。本文将谈到java.lang.Class,以及java.lang.reflect中的Method、Field、Constructor等等classes。
说多多的也没用,我就简单给你介绍几个。既然你学了Java,那么反射就算你不会,你在学习过程中也会经常遇到。1、有了反射机制,那么就能逆向代码了,反编译器就是这个原理。2、像流行的框架,Spring,Hibernate等,就是利用反射机制,要不然怎么可能你配置下文件就完事呢3、动态生成类啊,当然spring里面都用到了。希望我的回答对你有帮助!
Method类中的方法的使用(含代码和注释): getMethods()获得本类及父类中的public权限修饰**符方法getDeclaredMethods()专门获得调用该方法的对象的本类中的所有方法包括private权限修饰符**的方法getDeclaredMethod(String name,class...parameterTypes)第一个参数:方法的名称第二个参数:可变长度,写你要查找的那个方法的参数类型列表.classgetParameterCount()得到方法的参数个数123456package LessonForReflection03;import java.lang.reflect.Method;import java.lang.reflect.Modifier;abstract class Card{private void creatRandomNumbers(int count)//private关键字{}public void getFullCardsNumbers(String[] random, String pre_numbers){}public static void getUserInfor(){}public abstract void getUserInfor(String tel);public abstract void getUserInfor(int sal1, int sal2) throws ArrayIndexOutOfBoundsException,ArithmeticException;}public class MethodInforGetter {public static void main(String[] args) {Class c1 = Card.class;System.out.println("-------------------------");Method[] m1 = c1.getMethods();//getMethods()获得本类及父类中的public方法!for (Method m:m1){System.out.println(m);}System.out.println("-------------------------");Method[] m2 = c1.getDeclaredMethods();//getDeclaredMethods()专门获得本类中的所有方法包括private!for (Method m:m2){System.out.println(m);}System.out.println("-------------------------");/**getDeclaredMethod(String name,class...parameterTypes)*第一个参数:方法的名称*第二个参数:可变长度,写你要查找的那个方法的参数类型列表** getParameterCount()得到方法的参数个数*/try {Method m3 = 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("-------------------------");Method m4 = c1.getDeclaredMethod("getUserInfor", int.class,int.class);//getExceptionTypes()可以获得初始化当前Method对象的给Class对象初始化的那个类的那个指定方法抛出的异常类型Class[] exception = m4.getExceptionTypes();for (Class e:exception){System.out.println(e);}} catch (NoSuchMethodException | SecurityException e) {e.printStackTrace();}}}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 Constructor类中的方法的使用****xiaoyuani***m(含代码和注释): java.lang.reflect.Constructor:Constructor[] getConstructor()获得本类里的public权限修饰符构造函数,不能获取父类的!Constructor[] getDeclaredConstructor()获得本类中的所以构造函数!Constructor getConstructor(Class...parameterType)用参数决定获得本类中的某个的构造方法,只能获得public的Constructor getDeclaredConstructor(Class...parameterType)用参数决定获得本类中的某个构造方法附:JDK8.0之后新增的类:Executable:它是Method和Constructor的父类常用方法:getParameter()获得类中方法参数getExceptionTypes()获得类中某个方法抛出异常类型getMoidfiers()获得方法权限修饰符Parameter:封装并代表了参数实例123456789101112131415package LessonForReflection03;import java.lang.reflect.Constructor;import java.lang.reflect.Modifier;import java.lang.reflect.Parameter;/** java.lang.reflect.Constructor** Constructor[] getConstructor();获得本类里的public权限修饰符构造函数,不能获取父类的* Constructor[] getDeclaredConstructor();得本类里的全部构造** Constructor getConstructor(Class...parameterType);用参数决定获得哪个构造方法* Constructor getDeclaredConstructor(Class...parameterType);**/public class ConstructorInforGetter {public static void main(String[] args) {System.out.println("获得Cricle本类里的public权限修饰符构造函数,不能获取父类的Constructor[] getConstructor()");System.out.println("子类继承不了父类中的构造方法和private");//Constructor[] getConstructor()获得Cricle本类里的public权限修饰符构造函数,不能获取父类的//子类继承不了父类中的构造方法和privateClass 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 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 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 (Parameter p:p1){System.out.println(p);}} catch (NoSuchMethodException | SecurityException e) {e.printStackTrace();}}}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 代码中提到的Circle类和Shape类二者为继承关系: package LessonForReflection03;public class Circle extends Shape{private int r;private String color;public Circle(int r, String color) {super();this.r = r;this***lor = color;}public Circle(int r) {super();this.r = r;}protected Circle(String color) {super();this***lor = color;}Circle(){super();}}12345678910111213141516171819202122232425262728293031package LessonForReflection03;public class Shape {private int per;public Shape(int per) {super();this.per = per;}public Shape() {super();}}1234567891011121314151617 部分文字来源于:咕嘟咖啡杨海滨老师 — 《java编程语言高级特性》轻量化研习Java相关技术倡导者“爱码学院”联合创始人自适应教学理念提出者践行者;多年开发及项目管理经历;出版《JavaEE企业级应用与开发》一书;10余年高校项目实践毕设指导经验;企业软培经验丰富
Java中的反射机制,通俗点解释就是能够在程序运行中动态获取到内存中任一对象的信息,这些信息包括对象所属类、类中的方法和属性、以及它们的访问控制域和返回值类型等等,还可以通过反射动态调用对象中的方法,而不管该方法的访问域是私有或是公开,包括构造方法,还能实现动态代理等。总之,反射能够破坏掉JAVA类本身的封装性,进而获取其私有的或公开的信息,也就能突破封装进而调用私有的或公开的方法。
实现的话就是通过反射接口,JAVA把反射相关的类接口都封装在了java.lang.reflect这个包中,你可以研究下这个包中的类,对于类的每一个属性,如变量、方法,构造方法,这个包中都就与之相对应的类,通过这个类就可以操作这个属性了。
java反射很强大,但也很危险,在实际开发中应少用或不用,在必要用之时,往往也能解决你遇到的问题。
JAVA中反射是动态获取信息以及动态调用对象方法的一种反射机制。 Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态语言的一个关键性质。 Java反射的功能是在运行时判断任意一个对象所属的类,在运行时构造任意一个类的对象,在运行时判断任意一个类所具有的成员变量和方法,在运行时调用任意一个对象的方法,生成动态代理。 扩展资料: JAVA中反射实例: 1、Class superClass=clazz.getSuperclass();//获取父类。 System.out.println("getSuperclass:"+superClass)。 2、Class[] interfaces=clazz.getInterfaces();//获取实现接口。 System.out.println("getInterfaces:"+interfaces.length)。 3、Constructor[] cons=clazz.getConstructors();//构造方法。 System.out.println("getConstructors:"+cons.length)。 参考资料来源:百度百科: JAVA反射机制
Method类中的方法的使用(含代码和注释): getMethods()获得本类及父类中的public权限修饰**符方法getDeclaredMethods()专门获得调用该方法的对象的本类中的所有方法包括private权限修饰符**的方法getDeclaredMethod(String name,class...parameterTypes)第一个参数:方法的名称第二个参数:可变长度,写你要查找的那个方法的参数类型列表.classgetParameterCount()得到方法的参数个数123456package LessonForReflection03;import java.lang.reflect.Method;import java.lang.reflect.Modifier;abstract class Card{private void creatRandomNumbers(int count)//private关键字{}public void getFullCardsNumbers(String[] random, String pre_numbers){}public static void getUserInfor(){}public abstract void getUserInfor(String tel);public abstract void getUserInfor(int sal1, int sal2) throws ArrayIndexOutOfBoundsException,ArithmeticException;}public class MethodInforGetter {public static void main(String[] args) {Class c1 = Card.class;System.out.println("-------------------------");Method[] m1 = c1.getMethods();//getMethods()获得本类及父类中的public方法!for (Method m:m1){System.out.println(m);}System.out.println("-------------------------");Method[] m2 = c1.getDeclaredMethods();//getDeclaredMethods()专门获得本类中的所有方法包括private!for (Method m:m2){System.out.println(m);}System.out.println("-------------------------");/**getDeclaredMethod(String name,class...parameterTypes)*第一个参数:方法的名称*第二个参数:可变长度,写你要查找的那个方法的参数类型列表** getParameterCount()得到方法的参数个数*/try {Method m3 = 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("-------------------------");Method m4 = c1.getDeclaredMethod("getUserInfor", int.class,int.class);//getExceptionTypes()可以获得初始化当前Method对象的给Class对象初始化的那个类的那个指定方法抛出的异常类型Class[] exception = m4.getExceptionTypes();for (Class e:exception){System.out.println(e);}} catch (NoSuchMethodException | SecurityException e) {e.printStackTrace();}}}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 Constructor类中的方法的使用****xiaoyuani***m(含代码和注释): java.lang.reflect.Constructor:Constructor[] getConstructor()获得本类里的public权限修饰符构造函数,不能获取父类的!Constructor[] getDeclaredConstructor()获得本类中的所以构造函数!Constructor getConstructor(Class...parameterType)用参数决定获得本类中的某个的构造方法,只能获得public的Constructor getDeclaredConstructor(Class...parameterType)用参数决定获得本类中的某个构造方法附:JDK8.0之后新增的类:Executable:它是Method和Constructor的父类常用方法:getParameter()获得类中方法参数getExceptionTypes()获得类中某个方法抛出异常类型getMoidfiers()获得方法权限修饰符Parameter:封装并代表了参数实例123456789101112131415package LessonForReflection03;import java.lang.reflect.Constructor;import java.lang.reflect.Modifier;import java.lang.reflect.Parameter;/** java.lang.reflect.Constructor** Constructor[] getConstructor();获得本类里的public权限修饰符构造函数,不能获取父类的* Constructor[] getDeclaredConstructor();得本类里的全部构造** Constructor getConstructor(Class...parameterType);用参数决定获得哪个构造方法* Constructor getDeclaredConstructor(Class...parameterType);**/public class ConstructorInforGetter {public static void main(String[] args) {System.out.println("获得Cricle本类里的public权限修饰符构造函数,不能获取父类的Constructor[] getConstructor()");System.out.println("子类继承不了父类中的构造方法和private");//Constructor[] getConstructor()获得Cricle本类里的public权限修饰符构造函数,不能获取父类的//子类继承不了父类中的构造方法和privateClass 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 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 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 (Parameter p:p1){System.out.println(p);}} catch (NoSuchMethodException | SecurityException e) {e.printStackTrace();}}}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 代码中提到的Circle类和Shape类二者为继承关系: package LessonForReflection03;public class Circle extends Shape{private int r;private String color;public Circle(int r, String color) {super();this.r = r;this***lor = color;}public Circle(int r) {super();this.r = r;}protected Circle(String color) {super();this***lor = color;}Circle(){super();}}12345678910111213141516171819202122232425262728293031package LessonForReflection03;public class Shape {private int per;public Shape(int per) {super();this.per = per;}public Shape() {super();}}1234567891011121314151617 部分文字来源于:咕嘟咖啡杨海滨老师 — 《java编程语言高级特性》轻量化研习Java相关技术倡导者“爱码学院”联合创始人自适应教学理念提出者践行者;多年开发及项目管理经历;出版《JavaEE企业级应用与开发》一书;10余年高校项目实践毕设指导经验;企业软培经验丰富
反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容。并将字节码文件中的内容都封装成对象,这样便于操作这些成员。简单说:反射技术可以对一个类进行解剖。 反射的好处:大大地增强了程序的扩展性。 反射的基本步骤: 1、获得Class对象,就是获取到指定的名称的字节码文件对象。 2、实例化对象,获得类的属性、方法或构造函数。 3、访问属性、调用方法、调用构造函数创建对象。 获取这个Class对象,有三种方式: 1:通过每个对象都具备的方法getClass来获取。弊端:必须要创建该类对象,才可以调用getClass方法。 2:每一个数据类型(基本数据类型和引用数据类型)都有一个静态的属性class。弊端:必须要先明确该类。 前两种方式不利于程序的扩展,因为都需要在程序使用具体的类来完成。 3:使用的Class类中的方法,静态的forName方法。
Java反射-属性操作
本文由宠物迷 百科常识栏目发布,非常欢迎各位朋友分享到个人朋友圈,但转载请说明文章出处“java反射有哪些用途?????”
下一篇
狗狗发烧了怎么办