reflect反射的常用方式

来源:互联网 发布:好程序员特训营 编辑:程序博客网 时间:2024/06/05 03:56

反射是java中强有力的工具类,可以在不知道类或对象内部具体实现的情况下创建对象,获取属性,执行函数(包括访问私有属性和方法)等;常用方法有以下几种:
如,访问Person类
1.获取类字节码文件
a. 直接读取字节码文件
Class c = Person.class;//在和执行位置同一个文件位置时,可以这样索引;
b. 通过调用对象的getClass方法
Class c = new Person().getClass;
c.通过调用Class类的forName方法
Class c = Class.forName("com.test.Person");//索引字节码文件的地址;

Person p = new Person();Class c = Person.class;Class c1 = new Person().getClass();Class c2 = Class.forName("com.test.reflect.Person");

2.获取构造方法
Class c = Class.forName("com.test.reflect.Person");
a.获取public protected修饰的构造函数
Constructor con = c.getConstructor();//空参

Constructor con = c.getConstructor(null);//空参
Constructor con = c.getConstructor(String.class);//字符串参数
Object obj = con.newInstance("姓名");//对应构造函数,需要则写参数,不需要则不写或写null;
b.获取private修饰的构造函数
Constructor con = c.getDeclaredConstructor();//空参

Constructor con = c.getDeclaredConstructor(null);//空参
Constructor con = c.getDeclaredConstructor(String.class);//字符串参数
Object obj = con.newInstance("姓名");//不需要参数则不写或写null;


3.get对象内属性
a.public、protected修饰的非static属性
Field field = c.getField("属性名");
Object name = field.get(obj);//get方法内部传入对象,即获取此对象的本属性;
b.public、protected修饰的static属性
Field field = c.getField("属性名");
Object name = field.get(obj);//get方法内部传入对象obj或类c,或者传入null,由于是静态方法,所有对象共享,这几种方式是一样的;
c.private修饰的非static属性,其实就是在a,b基础上加上访问权限语句
Field field = c.getField("属性名");
field.setAccessible(true);//暴力访问权限设为true
Object name = field.get(obj);//get方法内部传入对象,即获取此对象的本属性;
d.private修饰的static属性
Field field = c.getField("属性名");
field.setAccessible(true);//暴力访问权限设为true
Object name = field.get(obj);//get方法内部传入对象obj或类c,或者传入null,由于是静态方法,所有对象共享,这几种方式是一样的;


4.set对象内属性
a.public、protected修饰的非static属性
Field field = c.getField("属性名");
field.set(obj,属性值);//set方法内部传入对象,和属性值,即设置对象的属性值;
b.public、protected修饰的static属性
Field field = c.getField("属性名");
field.set(obj,属性值);//set方法内部传入对象obj或类c,或者传入null,第二个传入属性值,由于是静态方法,所有对象共享,这几种方式是一样的;
c.private修饰的非static属性,其实就是在a,b基础上加上访问权限语句
Field field = c.getField("属性名");
field.setAccessible(true);//暴力访问权限设为true
field.set(obj,属性值);//set方法内部传入对象,和属性值,即设置对象的属性值;
d.private修饰的static属性
Field field = c.getField("属性名");
field.setAccessible(true);//暴力访问权限设为true
field.set(obj,属性值);//set方法内部传入对象obj或类c,或者传入null,第二个传入属性值,由于是静态方法,所有对象共享,这几种方式是一样的;


5.获取类中方法
a.访问调用public、protected修饰的类非static方法
Method method = c.getMethod("方法名",方法参数.class);//如果方法有多个参数,那么应把多个参数封装成Class数组,如果没有参数,则不写或写null;
method.invoke(obj,方法传入参数);//执行obj对象中的method方法,方法传入参数没有则不写或写null;
b.访问调用public、protected修饰的类static方法
Method method = c.getMethod("方法名",方法参数.class);//如果方法有多个参数,那么应把多个参数封装成Class数组,如果没有参数,则不写或写null;
method.invoke(obj,方法传入参数);//执行中的类方法,可写类c或对象obj或null,方法传入参数没有则不写或写null;
c.访问调用private修饰的类非static方法
Method method = c.getMethod("方法名",方法参数.class);//如果方法有多个参数,那么应把多个参数封装成Class数组,如果没有参数,则不写或写null;
method.setAccessible(true);//暴力访问权限设为true
method.invoke(obj,方法传入参数);//执行obj对象中的method方法,方法传入参数没有则不写或写null;
d.访问调用private修饰的类static方法
Method method = c.getMethod("方法名",方法参数.class);//如果方法有多个参数,那么应把多个参数封装成Class数组,如果没有参数,则不写或写null;
method.setAccessible(true);//暴力访问权限设为true
method.invoke(obj,方法传入参数);//执行中的类方法,可写类c或对象obj或null,方法传入参数没有则不写或写null;

0 0
原创粉丝点击