本文主要解释一下几个问题
1、如何根据对象获得类的所有方法和属性
2、如何根据类名获得类的方法和属性
3、如何选择被反射类的构造函数 并 调用该函数获得实例
4、如何批量执行无参函数
5、如何调用指定名字的方法
6、如何调用有参的函数
7、如何反射调用类的私有方法
————————————————————————————————————
package com.hhf.reflect; /** * 等待被反射的类 * 用于解释如何通过反射获得类的方法与属性 * 如何选择被反射类的构造函数 * 如何批量执行类的函数 * @author HHF * 2014年4月17日 */ public class DataFunc { private int data1; private int data2; private int result; public DataFunc() { data1=0; data2=0; result=0; } public DataFunc(int x,int y){ data1=x; data2=y; } public int add(){ result=data1+data2+1; return result; } public int substract(){ result=data1-data2; return result; } public int multiply(){ result=data1*data2; return result; } public int divide(){ result=data1/data2; return result; } }
package com.hhf.reflect; /** * 等待被反射的类 * 主要为了解释一个有参的方法如何反射调用 * @author HHF * 2014年4月17日 */ public class DataFunc2 { @SuppressWarnings("unused") private int data1; @SuppressWarnings("unused") private int data2; private int result; public DataFunc2() { data1 = 0; data2 = 0; result = 0; } public DataFunc2(int x, int y) { data1 = x; data2 = y; } public int add2(int a, int b, int c) { result = a + b + c; return result; } }
package com.hhf.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Refect { // JAVA反射机制是在 运行状态 中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 // Java反射机制主要提供了以下功能: // 在运行时判断任意一个对象所属的类; // 在运行时构造任意一个类的对象; // 在运行时判断任意一个类所具有的成员变量和方法; // 在运行时调用任意一个对象的方法;生成动态代理。 // 使用反射机制的步骤: // 导入java.lang.relfect 包 // 遵循三个步骤 // 第一步是获得你想操作的类的 java.lang.Class 对象 // 第二步是调用诸如 getDeclaredMethods 的方法 // 第三步使用 反射API 来操作这些信息 public static void main(String [] args){ Refect refect = new Refect(); System.out.println("-----------------------通过对象获得方法和属性------------------------"); refect.reflectInstance(); System.out.println("-----------------------通过类名获得方法与参数----------------------------"); refect.reflectClass(); System.out.println("-----------------------批量执行方法------------------------------"); refect.RunMethod(); System.out.println("-----------------------调用指定无参方法----------------------------"); refect.RunSepcMethod(); System.out.println("-----------------------调用有参数方法------------------------------"); refect.RunParmMethod(); } /** * 通过对象获得类的 方法和属性 */ public void reflectInstance() { try { DataFunc a = new DataFunc(); Class cla = Class.forName(a.getClass().getName());// 根据类的全路径进行类加载,返回该类的Class对象 Method[] method = cla.getDeclaredMethods();// 利用得到的Class对象的自审,返回方法对象集合 System.out.println("********该类的所有方法********"); for (Method me : method) {// 遍历该类方法的集合 System.out.println(me.toString());// 打印方法信息 } System.out.println("********该类的所有属性********"); Field[] field = cla.getDeclaredFields();// 利用得到的Class对象的自审,返回属性对象集合 for (Field me : field) { // 遍历该类属性的集合 System.out.println(me.toString());// 打印属性信息 } } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 通过类的完整路径获得类的 方法和属性 */ public void reflectClass() { try { Class cla = Class.forName("com.hhf.reflect.DataFunc");// 根据类的全路径进行类加载,返回该类的Class对象 Method[] method = cla.getDeclaredMethods();// 利用得到的Class对象的自审,返回方法对象集合 System.out.println("********该类的所有方法********"); for (Method me : method) {// 遍历该类方法的集合 System.out.println(me.toString());// 打印方法信息 } System.out.println("********该类的所有属性********"); Field[] field = cla.getDeclaredFields();// 利用得到的Class对象的自审,返回属性对象集合 for (Field me : field) { // 遍历该类属性的集合 System.out.println(me.toString());// 打印属性信息 } } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 指定构造函数 * 可以另外的通过构造函数给函数属性传递参数 并调用方法 */ public void RunMethod() { try { // 获得指定字符串类对象 Class cla = Class.forName("com.hhf.reflect.DataFunc"); // 设置Class对象数组,用于指定构造方法类型 Class[] cl = new Class[] { int.class, int.class }; // 获得Constructor构造器对象。并指定构造方法类型 Constructor con = cla.getConstructor(cl); // 给传入参数赋初值 Object[] x = { new Integer(33), new Integer(67) }; // 得到实例 Object obj = con.newInstance(x); Method[] method = cla.getDeclaredMethods();// 利用得到的Class对象的自审,返回方法对象集合 //批量调用方法(无参数的方法) for (Method me : method) {// 遍历该类方法的集合 System.out.print("调用方法:"+me.toString());// 打印方法信息 String str = me.invoke(obj).toString(); System.out.println("\t该方法执行结果"+str); } } catch (Exception e) { e.printStackTrace(); } } /** * 指定方法名的调用方法 */ public void RunSepcMethod() { try { // 获得指定字符串类对象 Class cla = Class.forName("com.hhf.reflect.DataFunc"); // 设置Class对象数组,用于指定构造方法类型 Class[] cl = new Class[] { int.class, int.class }; // 获得Constructor构造器对象。并指定构造方法类型 Constructor con = cla.getConstructor(cl); // 给传入参数赋初值 Object[] x = { new Integer(33), new Integer(67) }; // 得到实例 Object obj = con.newInstance(x); Method specMethod = cla.getMethod("add"); String str = specMethod.invoke(obj).toString(); System.out.println("调用方法"+specMethod.getName()+"的结果\t"+str); } catch (Exception e) { e.printStackTrace(); } } /** * 调用有参数的方法 */ public void RunParmMethod() { try { // 获得指定字符串类对象 Class cla = Class.forName("com.hhf.reflect.DataFunc2"); // 设置Class对象数组,用于指定构造方法类型 Class[] cl = new Class[] { int.class, int.class }; // 获得Constructor构造器对象。并指定构造方法类型 Constructor con = cla.getConstructor(cl); // 给传入参数赋初值 Object[] x = { new Integer(33), new Integer(67) }; // 得到实例 Object obj = con.newInstance(x); // Method specMethod1 = cla.getMethod("a", int.class, int.class); Class[] c2 = new Class[] { int.class, int.class, int.class}; Method parmMethod = cla.getMethod("add2", c2); // 给传入参数赋初值 Object[] x2 = { new Integer(3), new Integer(6), new Integer(1)}; // 得到实例 String str = parmMethod.invoke(obj, x2).toString(); System.out.println("调用方法"+parmMethod.getName()+"的结果\t"+str); } catch (Exception e) { e.printStackTrace(); } } }
//等待被反射的类 其中只有一个私有方法 public class PrivateMethod { //私有方法 private int add(int a, int b){ return a +b+1 ; } }
//反射调用私有方法 //获取目标类的class对象 Class<PrivateMethod> class1 = PrivateMethod.class; //获取目标类的实例 Object instance = class1.newInstance(); //getDeclaredMethod() 可获取 公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 Method method = class1.getDeclaredMethod("add", new Class[]{int.class,int.class}); //值为true时 反射的对象在使用时 应让一切已有的访问权限取消 method.setAccessible(true); Object result = method.invoke(instance, new Object[]{1,2});
相关推荐
scrcpy投屏 AssertionError: java.lang.reflect.InvocationTargetException 安装这个版本的scrcpy即可。
解决axis2-CodegenWizardPlugin的BUG,java.lang.reflect.InvocationTargetException 带有相关jar 包及相关文件
java.lang.reflect.Proxy 学习资料 讲解 例子 源码 java.lang.reflect.Proxy 学习资料 讲解 例子 源码 java.lang.reflect.Proxy 学习资料 讲解 例子 源码
MyEclipse axis2 wsdl java.lang.reflect.invocationtargetexception code gen 大家要注意一定要仔细,这个问题基本上缺少包引起的,而且一定要clean 如果需要axis2插件 以及这个plugins中的包在我的其他资源里面有
MyEclipse6.0下axis2插件的安装! 解决java.lang.reflect.InvocationTargetException本人亲自测试,完美使用!
免费共享,很详细的介绍了反射机制的原理,适合追根究底的java学习者
NULL 博文链接:https://inter12.iteye.com/blog/1288117
at java.lang.reflect.Method.invoke(Method.java:585) at org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.java:397) at org.apache.axis.providers.java.RPCProvider.processMessage...
java.lang.reflect.Constructor; java.lang.reflect.Field; java.lang.reflect.Method; java.lang.reflect.Modifier;
java.lang.NullPointerException ... at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.tomcat.websocket.pojo.PojoMessageHandlerWholeBase.onMessage(PojoMessageHandlerWholeBase.java:80)
java反射(reflect)
Caused by: java.lang.ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.Access...
Java EE:Reflect 反射技术.docx
//类的成员变量 java.lang.reflect.Method;//类的方法 java.lang.reflect.Modifier;//访问权限 Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第6页。 3.2.4 使用反射机制的步骤 导入Jjava.lang....
ava反射机制 概述:通俗地讲Java反射就是通过类名获得类的实例的方法。java.lang.reflect提供了实现Java反射的API。
包含有org.apache.commons.lang3.StringUtils; org.apache.commons.lang3.reflect.FieldUtils等类
NULL 博文链接:https://kdisk-sina-com.iteye.com/blog/258942
at javax.imageio.ImageIO.read(ImageIO.java:1388) at com.pleanwar.fiying.FlyingObject.loadImage(FlyingObject.java:52) at com.pleanwar.hero.HeroAirPlean.(HeroAirPlean.java:22) Exception in thre
什么是java中的反射机制(reflect).docx
import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class ReflectionTest { public static void main(String[] args) { Class c = null; try { ...