反射机制
前言
反射是程序的自我分析能力,通过反射可以确定类有哪些方法(函数)、构造器(构造函数)、属性(成员变量)。通过反射机制可以动态的读取一个类的信息。能够在运行时动态的加载类,而不是在编译期间,反射可以应用在框架开发,从配置文件中动态的加载类,创建对象、以及使用方法和成员变量。
一、java.lang.Class类
我们可以通过java.lang.Class类和 java.lang.reflect 类来使用反射来创建Class对象。并获取方法、属性、构造器等信息
二、创建Class对象的三种方式
1 :静态创建 Class.forName(String className)
使用 Class.forName(String className)
该方法从文件中寻找编译后的.class 文件,参数为 绝对包名.class,并返回一个class<?>对象;
2:实例.getClass()
调用某个类的实例的.getClass()方法,来创建该对象所属对应的Class对象,该方法继承自Object 类;
3. 类名.Class
使用某个类的.Class属性返回一个该类所对应的Class对象
代码演示如下:
//创建了一个学生类,做为反射的测试对象
import cn.plh.reflect.myclass.Study;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Study {
private int age;
private String name;
private char sex;
private int id;
private String country;
private String major;
public void show(){
System.out.println("我是:"+name+"\n我的年龄是:" +
"" + age+"\n我的性别是:"+sex+"\n" +
"我的id是:"+id+"\n 我的国家是:"+country+" " +
"\n我的专业是:"+major);
}
public Study(String name,int id , char sex){
this.name=name;
this.id=id;
this.sex=sex;
}
public Study(){}
}
public class ReflectStudy {
public static void main(String[] args) {
try {
Study s = new Study();
//1.通过Class.forName()方法来创建 参数为完整的包名.类名
Class<?> myClass = Class.forName("cn.plh.reflect.myclass.Study");、
//2.实例.getClass
Class<?> myClass2 = s.getClass();
//3.类名.Class
Class<?> myClass3 = Study.class;
//使用getDeclaredField(" ")获取属性
Field idF = myClass.getDeclaredField("id");
Field nameF = myClass.getDeclaredField("name");
Field sexF = myClass.getDeclaredField("sex");
Field countryF = myClass.getDeclaredField("country");
//使用newInstance()方法来创建实例,并强制转换为Study类
Study study = (Study) myClass.newInstance();
//通过getMethod()方法获取方法
Method m = myClass.getMethod("show");
//打破私有封装型
idF.setAccessible(true);
//使用set()方法来设置属性值
idF.set(study, 10001);
nameF.setAccessible(true);
nameF.set(study, "张三");
sexF.setAccessible(true);
sexF.set(study, '男');
countryF.setAccessible(true);
countryF.set(study, "中国");
//使用invoke来调用方法
m.invoke(study);
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
}