JAVA中的反射(框架的灵魂)
反射
在我看来反射就是获取一个类中的类名、方法名、变量 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象
(反射就是把java类中的各成分映射成一个个的对象)
反射的使用
1、获取Class对象的三种方式
1.1如果创建了对象(Object),直接使用Object.getClass()
1.2直接使用类名.class
1.3使用Class中的forName(String className)方法Class.forName()
public class TestFanshe {
public static void main(String[] args) throws ClassNotFoundException {
/**
* 1.1如果创建了对象(Object),直接使用Object.getClass()
**/
Student stu = new Student();
Class Cls1 = stu.getClass();
/**
* 1.2直接使用类名.class
**/
Class Cls2 = Student.class;
/**1.3使用Class中的forName(String className)方法Class.forName()
*
**/
Class Cls3 = Class.forName("fanshe.Student");
System.out.println(Cls1);
System.out.println(Cls2);
System.out.println(Cls3);
}
}
2、获取构造方法
2.1获取公有的构造方法
public Constructor[] getConstructors()(获取所有的) public Constructor getConstructor(Class… parameterTypes)(获取单个的)
2.2获取全部的构造方法(包括私有)
public Constructor[] getDeclaredConstructors() public Constructor getDeclaredConstructor(Class… parameterTypes)
2.3构造方法的使用
Constructor–>newInstance(Object… initargs)
package fanshe;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class TestFanshe01 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Class Cls = Class.forName("fanshe.Student");
Constructor[] constructors = Cls.getConstructors();
Constructor constructor = Cls.getConstructor(int.class, String.class);
Constructor[] declaredConstructors = Cls.getDeclaredConstructors();
Constructor declaredConstructor = Cls.getDeclaredConstructor(int.class);
Object o = constructor.newInstance(18, "张三");
System.out.println(o);
}
}
3、获取成员方法
3.1成员方法的使用
Object obj = 类名.class.getConstructor().newInstance() 方法名.invoke(要调用方法的对象(obj),要调用的方法名)
package fanshe;
import java.lang.reflect.Method;
public class TestFanshe02 {
public static void main(String[] args) throws Exception {
Class cls = Class.forName("fanshe.Student");
Method[] methods = cls.getMethods();
Method method = cls.getMethod("show");
Method[] declaredMethods = cls.getDeclaredMethods();
Method declaredMethod = cls.getDeclaredMethod("show");
Object o = cls.newInstance();
method.invoke(o);
}
}
4、获取成员变量(和获取成员方法差不多就不在演示)
注意:一个类在运行期间只会产生一个class文件
反射的作用
1、运行配置文件内容
2、越过泛型检查
|