什么是 java 的反射机制?
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用他 的任意一个方法和属性,种种动态获取的信息以及动态调用对象的方法的功能称为 java 语言的反射机制。
Java 有个 Object 类,是所有 java 类的继承根源,其声明了多个可以在所有 java 类中被改写的方法,其中就有 getClass 方法,该方法返回一个 Class 对象。
Class 类十分特殊。他和一般类一样继承与 Object,他实体用来表示 java 程序运行时的 classes 和 interface,也 用来表示 enum,array,int…。当一个 class 被加载,或当加载器的 defineClass()被 JVM 调用,JVM’便自动产生一个 Class 对象。
Class 类提供了大量的实力方法来获取该 Class 对象所对应的详细信息,Class 类大致包含如下方法:
获取类内的信息:
获取内容: 构造器。
Constructor<T> getConstructor(Class<?>...Types)//获取公有的构造方法
包含的方法:Method getMethod(String name,Class<?>...Types)
包含的属性:Field getField(String name)
包含的 Annotation :<A extends Annotation> A getAnnotation(Class<A>annotationClass)
内部类:Class<?>getDeclaredClasses()
外部类:Class<?> getDeclaringClasses() 所实现的接口:Class<?> [] getInterfaces()
修饰符: int getMoifiers()
所在包:Package getPackage()
类名:String getName()
简称: String getSimpleName()
getDeclaredConstructor();//可以获取私有的构造方法
反射机制的作用:
1 反编译:.class->.java
2 通过反射机制访问 java 对象的属性方法,构造方法等
反射机制获取类有三种方法:
一、获取 People 类型
1 第一种方式: Class c1= Class.forName(“People”);
2 第二种方式:java 中每个对象都有 class 属性。 Class c2 =Employee.class;
3 第三种方式:java 语言中任何一个 java 对象都有 getClass 方法。 People p=new People(); Class c3 = p.getClass();
二、创建对象:获取类以后我们来创建对象,利用 newInstance 方法 Class c = Class.forName(“People”); //创建此 Class 对象所表示的类的一个新实例
Object O = c.newInstance();//调用 People 的无参构造方法
//反射出无参的构造方法并得到对象
String classname1="org.example.hello.People";
Class class1=Class.forName(classname1);
Object object1=class1.newInstance();
System.out.println(object1.toString());
//反射出带参数的构造方法并得到对象
String classname2="org.example.hello.People";
Class class2=Class.forName(classname2);
Constructor constructor1=class2.getConstructor(String.class,int.class);
//*********int.class 表示是 int 类型,Integer.class 表示 java.lang.Integer 类型*******//
Object object2=constructor1.newInstance("小明",18);
System.out.println(object1.toString());
//调用对象的带参数的方法
String classname3="org.example.hello.People";
Class class3=Class.forName(classname3);
Method method=class3.getMethod("fun", int.class);
Object object3=class3.newInstance();
method.invoke(object3,1);
System.out.println(object3.toString());
Object object=c.newInstance();
java.lang.reflect.Field f=constructor.getDeclaredField("name");
f.setAccessible(true);//如果当前属性是私有,修改属性信息需要添加该代码,设访问权限
f.set(object, "zs");//设置类中的私有属性信息
三、invoke 方法的作用
Invoke 方法用来执行实例中的方法。相当于“ .方法名”。
Constructor con=c.getDeclaredConstructor(String.class);
con.setAccessible(true);
Object o =con.newInstance("zs");
Method m=c.getMethod("publicFun", String.class);
Object result = m.invoke(o, "publicFun");
System.out.println(result);