反射是java中很重要的知识,因为一些框架都用到了反射了,不懂反射,你可能就不懂框架的一些原理。反射的作用是通过反射获取一个类,类的变量(私有,公有,默认,保护等),还可以获取类的方法等等。简单的来说就是4个,Field(变量),Method(方法),Class(类对象),Constructor(构造方法).使用反射的前提是要获取类的字节码文件,即类的.class文件(字节码文件),因为是从.class文件中,去解析类.把各个成分解析成一个对象.
获取class对象有以下几种方法方法,接下来我们来简单操作:
public class School {
public void schoolTest() throws ClassNotFoundException {
// 通过实例化对象去获取class,这种已经实例化了对象,要 class也没有什么作用
School school = new School();
Class c1 = school.getClass();
// 通过对象去获取class,这种方式对于包的依赖性很强
Class c2= School.class;
// 通过对象去获取包路径,我们大多数都是用这种方式
Class c3 = Class.forName("com.jinshuaitec.sort.reflex.School");
}
}
接下来我们要获取构造方法
public School(){
System.out.println("empty");
}
public School(String name){
System.out.println(name);
}
public School(int age){
System.out.println(age);
}
在这里书写了三个构造方法.
让我们来看下源码
// 批量获取方法
public Constructor[] getConstructors(); //获取所有的public 方法
public Constructor[] getDeclaredConstructors();//获取所有的方法,包括private,protected,default等
// 获取单个方法
public Constructor getConstructor(Class... parameterTypes)//根据参数类型获取公有的构造方法
public Constructor getDeclaredConstructor(Class... parameterTypes)//根据参数类型获取所有的构造方法
操作:
Class reflexTest = Class.forName("com.jinshuaitec.sort.reflex.School");
System.out.println("start print constructor");
Constructor[] conArray = reflexTest.getConstructors();
for (Constructor constructor: conArray){
System.out.println(constructor);
}
System.out.println("获取所有的构造方法");
conArray = reflexTest.getDeclaredConstructors();
for (Constructor constructor:conArray){
System.out.println(constructor);
}
System.out.println("获取公有的无参构造方法");
Constructor constructor = reflexTest.getConstructor(null);
System.out.println(constructor);
Object object = constructor.newInstance("我是第一个参数");//实例化对象
// 获取String类型参数的构造方法
Constructor constructor1 = reflexTest.getConstructor(String.class);
接下来获取成员变量
定义变量:
public String schoolName;
protected int schoolIphone;
private String schoolAddress;
接下来获取数据
public void filed() throws Exception{
Class school = Class.forName("com.jinshuaitec.sort.reflex.School");
System.out.println("获取所有的public字段");
Field[] fields = school.getFields();
for (Field field :fields){
System.out.println(field.getName());
}
System.out.println("获取所有的private,protected,default等字段");
Field [] privateFields = school.getDeclaredFields();
for (Field field : privateFields){
System.out.println(field.getName() + "获取变量名字");
}
System.out.println("获得某一个变量");
Field f = school.getField("schoolName");
System.out.println("创建对象实例");
Object obj = school.getConstructor().newInstance();
System.out.println("为变量赋值");
// 给name属性赋值,obj为某一个类
f.set(obj,"我是name属性");
// 这里有一个注明,要获取私有变量时,赢应书写下面的语句
// 这里表明解除私有的限制,让外界可以访问到
f.setAccessible(true);
}
接下来是获取Method:
public void method() throws Exception{
// 获取类文件
Class school = Class.forName("com.jinshuaitec.sort.reflex.School");
// 获取公开的方法
Method[] methods = school.getMethods();
for (Method method : methods){
System.out.println(method.getName());
}
// 获取所有的方法,包括private,protected等
Method [] declareMethod = school.getDeclaredMethods();
for (Method method : declareMethod){
System.out.println(method);
}
Method publicMethod = school.getMethod("publicMethod", String.class);
// 执行方法
publicMethod.invoke(school,"我是jins");
Method defaultMethod = school.getDeclaredMethod("defaultMethod");
Method privateMethod = school.getDeclaredMethod("privateMethod", int.class);
// 执行私有方法
privateMethod.invoke(school,12);
}
反射可能在我们写代码的时候很少用到,但是你用的很多地方都用到了反射,希望以后大家在用到反射的时候可以手到拈来.
如果大家还想看我的更多文章,请大家关注我的微信公众号(程序员知识积累).谢谢大家