标签:
虽然网上有很多的做饭,但是对于新手的朋友们来说,并不是能够看得懂。
反射技术:可以对一个类进行解刨,首先要获取该类的字节码文件内容,并将内容都封装成了对象。
访问属性,方法,以及构造函数,然后在调用构造函数,创建对象。
调用空参数的构造函数用的是Class类中的newInstance方法。
调用带参数的构造函数用的是构造函数本身的newInstance方法。
在这里我只做了两种方法,利用反射创建对象,并调用方法,获取变量值。
对于我的这两种方式也有需要优化的地方,但是在这里我们只接受这两种方式。
Class.forName();用于做类加载,指定什么类名就获取什么类的字节码。
getConstructor();获取构造函数,并创建对象,调用方法。获取其变量值
package pack; import java.lang.reflect.*; class Reflect{ public static void main(String[] args)throws Exception{ Class<?> c=Class.forName("pack.ReflectPoint");c.newInstance();// 接受一个完整类名,并使用Class类中的newInstance创建对象。 Method method=c.getMethod("add");method.invoke(null);// 获取该对象的方法,并调用。 Field fieldX=c.getDeclaredField("x");// 由于变量是私有的,所以我们使用暴力反射。 fieldX.setAccessible(true); System.out.println(fieldX.get(c.newInstance()));// 获取该变量的值,Field.get接受的参数必须是一个对象。 Constructor tts=ReflectPoint.class.getConstructor(String.class);// 每一个基本类型都有一个静态的class,获取该类的字节码后并获取一个带参数的 ReflectPoint r=(ReflectPoint)tts.newInstance(new String("abc"));r.add();// 进行强转,并调用构造函数的newInstance方法,传入参数,调用方法。 Field fieldY=r.getClass().getField("y");System.out.println(fieldY.get(r));// 获取其变量, } } class ReflectPoint{ private static int x=3; public static int y=4; ReflectPoint(){System.out.println("无参");} public ReflectPoint(String s){System.out.println("有参");} public static void add(){ System.out.println(x+y); } }
标签:
原文地址:http://blog.csdn.net/qiang3570/article/details/44871105