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;
- reflect反射的常用方式
- 【反射】Reflect的使用
- Reflect反射的基础知识
- 反射(reflect)的knowledge
- Java的反射reflect使用
- 浅谈Java反射(Reflect)技术--常用方法
- 反射reflect
- 反射reflect
- 反射Reflect
- 反射Reflect
- Reflect反射
- reflect(反射)
- 反射Reflect
- 反射 Reflect
- reflect(反射)
- reflect--反射
- reflect(反射)
- 反射reflect
- java高级之多线程(一)
- js中Map的key为一个变量
- 【转】运营11年亏损6亿 电视台倒闭 电视媒体寒冬来临?
- Ubuntu14.04安装jetson tx1交叉编译工具
- spring boot与kafka集成
- reflect反射的常用方式
- C语言程序设计入门(一)
- 用MASM32写了一个Word启动故障修复程序fixWord
- pb 改变dw选中行颜色的小技巧
- 使用检查数据(int,double,float等)溢出,并抛出异常
- HTTP之Range
- Java对象深复制与浅复制
- 文章标题
- git无法pull仓库refusing to merge unrelated histories