java反射详解
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java反射详解,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5295字,纯文字阅读大概需要8分钟。
内容图文
![java反射详解](/upload/InfoBanner/zyjiaocheng/772/14ac57bc294e4628a4b71e509ef6f371.jpg)
反射概述
1、java反射:在程序运行过程中,可以对任意一个类型进行任意
的操作。例如:加载任意类型、调用类型的任意方法、获取任意
的成员变量、构造方法,可以创建该类型的对象。 2、对于任意一个对象,都能调用这个对象的任意一个方法【不知
道要使用什么类型】
3、如果要获取一个类型的各种内容,首先要获取这个类的字节码
对象
4、解剖这个类型,获取类中的成员,需要使用Class类型中定义的
方法
5、这种【动态】获取信息以及【动态】访问成员的这种方式,称
为:反射
获取类的字节码对象(Class类型对象)的三种方式
1、要想获取和操作类中的内容,首先要获取类的字节码对象
2、这些对象(类的字节码对象,也称为.class对象),都是Class类型的对象
3、获取字节码对象的方式:
1.对象名.getClass();例如 Class c=new people().getClass();
2.类名.class;例如 Class c=people.class;
3.Class.forName(传入一个类的全类名);例如 Class c=Class.forName(包名.类名);
package reflection;
public class Service1 {
public void doService() {
System.out.println("业务方法一");
}
public static void main(String[] args) throws ClassNotFoundException {
//对象.getClass();
Class c=new Service1().getClass();
//类名.class
Class c1=Service1.class;
//Class.forName(类路径);
Class c2=Class.forName("reflection.Service1");
System.out.println(c2.getName());
}
}
Class类中的方法
概述
1、一旦获取了类的字节码对象,就可以使用这个对象的所有
方法,这些方法都定义在Class类型中。
2、成员方法:获取这个类的各种信息
成员变量、成员方法、构造方法、内部类、类的注解、类
所在的包、类的修饰符、判断类的类型
以上内容获取出来以后,又是一些对象,有专门的数据类
型,描述这些对象
3、其中,有一个非常常用的方法:newInstance()
创建这个字节码描述的类型的实例对象,例如使用
Person.class字节码对象,调用newInstance方法,就可以创建一
个真正的Person对象
获取类中的构造方法并使用
1、通过Class类中的:
getConstructor(Class…paramTypes)
参数列表:Class…paramTypes,表示一个可变参数,需要传入构造方法
的类型的字节码
返回值类型:Constructor,表示一个构造方法类型的对象
2、Constructor类型:
1、表示构造方法类型,这个类的每个对象,都是一个确定的,具体的
构造方法
2、构造方法对象应该具有的功能:获取构造方法各种信息(构造方法
修饰符、构造方法名称、构造方法的参数列表、构造方法的注解),最
基本的一个功能就是,创建对象
newInstance(Object…objs)
返回一个Object类型的对象
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Demo05_获取类的构造方法并使用 {
public static void main(String[] args) throws NoSuchMethodException, SecurityException,
InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Class c = Person.class;
//获取c中的构造方法
Constructor con = c.getConstructor(String.class, int.class);
//使用这个构造方法,创建有参数的Person对象
Object obj = con.newInstance("zhangsan", 23);
System.out.println(obj);
} }
获取类中的成员变量并使用
1、通过Class类中的:
getField(String propertyName)
参数列表:属性的名称
返回值类型:Field,表示一个成员变量对象,所属的类型
2、Field类型:表示一个成员变量类型,每个对象都是一个具体的
成员变量
作用:获取成员变量的各种信息(修饰符、注解、名称); 做各种数据类型的转换
赋值:set(Object obj, Object value),用于给obj对象的,该
成员变量,赋value值
import java.lang.reflect.Field;
public class Demo06_获取类的成员变量并赋值 {
public static void main(String[] args) throws Exception {
Person p = new Person();
System.out.println(p);
//首先获取类的字节码对象
Class c = p.getClass();
//获取age这个成员变量
Field f = c.getField("age");
//给p对象的f成员变量,赋23值
f.set(p, 23);
System.out.println(p);
} }
暴力反射
1、通过Class类中:
getDeclaredXxx方法:可以获取类中的所有声明的成员(属 性、方法、内部类),私有的成员也可以获取到。
2、修改该对象的访问权限:
成员变量、构造方法还是成员方法,都是AccessibleObject
类型的子类,就具有判断是否可以访问,和设置是否可以
访问的方法
isAccessible():判断当前对象是否可以访问
setAccessible(boolean flag):设定当前对象是否可以访问
3、一旦设定当前对象可以访问,私有的成员也可以被访问,被修
改
import java.lang.reflect.Field;
public class Demo07_暴力反射 {
public static void main(String[] args) throws Exception {
Person p = new Person();
//获取Person的字节码对象
Class c = p.getClass();
//获取Person类中的age成员变量,由于age是私有属性,所以需要使用getDeclaredField
Field f = c.getDeclaredField("age");
//判断该成员变量是否可以访问
System.out.println(f.isAccessible());
//将该成员变量设置为可以访问的权限
f.setAccessible(true);
System.out.println(f.isAccessible());
//使用f的set方法,将p对象的f属性,设置为23这个值
f.set(p, 23);
System.out.println(p);
} }
获取类中的成员方法并且执行
1、通过Class类中:
getMethod(String methodName, Class…paramTypes)
参数列表:methodName表示方法名称,paramTypes表示参数列表的数据类 型
返回值类型:Method
2、Method类型:
1、表示成员方法的类型,该类型的每个对象,都是一个具体的成员方法
2、成员方法对象的方法:获取成员方法信息(方法的注解、方法的修饰
符、方法的返回值类型、方法的名称、方法的参数)
3、其中,最重要的一个方法,就是该方法的执行:
invoke(Object obj, Object…values)
在obj对象上,执行该方法,使用的实际参数是values
import java.lang.reflect.Method;
public class Demo08_获取成员方法并执行 {
public static void main(String[] args) throws Exception {
Person p = new Person();
//获取设置age的方法,就先获取Person类型的字节码对象
Class c = p.getClass();
//方法的名称:setAge
Method m = c.getMethod("setAge", int.class);
//给p的age属性赋值为123,不能使用暴力反射
m.invoke(p, 123);
System.out.println(p);
} }
内容总结
以上是互联网集市为您收集整理的java反射详解全部内容,希望文章能够帮你解决java反射详解所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。