引言:最近无意中在项目中看到了使用反射机制的代码,好奇心顿起,于是在网上找了些资料学习了下...
反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力。通过这种能力可以彻底的了解自身的情况为下一步的动作做准备。
Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method;其中class代表的时类对 象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象。通过这四个对象我们可以粗略的看到一个类的各个组成部分。
Java反射机制主要提供了以下功能:在运行时判定任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判定任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。hibernate的延迟载入,spring的AOP都是这么实现的.
下面我们来看看具体的代码实现:
实体类:Simple
package test;
public class Simple {
public String a = "zwm";
protected int m = 2;
private int i = 1;
public Simple(){
}
public Simple(String s){
this.a=s;
}
protected void print(String str, int i) {
System.out.println(i + "--测试---" + str);
}
private void print1(String str ) {
System.out.println("测试---" + str);
}
}
测试类:testFs
package test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class testFs {
public static void main(String[] args) throws ClassNotFoundException,
SecurityException, NoSuchMethodException, InstantiationException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException, NoSuchFieldException {
Class<?> simpleClass = Class.forName("test.Simple");
Object simpelObject = simpleClass.newInstance();
//getFields()、getDeclaredFields(),它们分别是用来获取反射类中所有公有
//属性和反射类中所有的属性的方法
Field[] fields=simpleClass.getFields();//获取反射类中所有公有属性
System.out.println("获取反射类中所有公有属性:");
System.out.println("fields.length====>"+fields.length);
for (int i = 0; i < fields.length; i++) {
Class<?> cl=fields[i].getType();
System.out.println("cl===>"+cl);
}
Field[] fields1=simpleClass.getDeclaredFields();//获取反射类中所有的属性
System.out.println("获取反射类中所有的属性:");
System.out.println("fields1.length====>"+fields1.length);
for (int i = 0; i < fields1.length; i++) {
Class<?> cl1=fields1[i].getType();
System.out.println("cl1===>"+cl1);
}
Field f = simpleClass.getDeclaredField("i");//获取反射类中私有的属性
//setAccessible方法,它是用来设置是否有权限访问反射类中的私有属性的,只有设置为true时才可以访问,默认为false
f.setAccessible(true);
Integer i = (Integer)f.get(new Simple());
System.out.println("获取反射类中私有的属:");
System.out.println("i====>"+i);
String className = simpleClass.getName(); //获取指定类的类名
Constructor[] constructors = simpleClass.getConstructors();//获取指定类的构造方法
System.out.println("获取指定类的构造方法:");
for ( int m= 0 ; m<constructors.length; m++) {
Class[] parameterTypes = constructors[m].getParameterTypes();//获取指定构造方法的参数的集合
System.out.print(className + "(" );
for ( int j= 0 ; j<parameterTypes.length; j++)
System.out.print(parameterTypes[j].getName() + " " );
System.out.println(")" );
}
Method[] Methods= simpleClass.getDeclaredMethods();
System.out.println("获取指定类的所有方法");
for (int j = 0; j < Methods.length; j++) {
//输出方法的返回类型
System.out.print(Methods[j].getReturnType().getName());
//输出方法名
System.out.print(" " +Methods[j].getName()+ "(" );
//获取方法的参数
Class[] parameterTypes = Methods[j].getParameterTypes();
for ( int k= 0 ; k<parameterTypes.length; k++){
System.out.print(parameterTypes[k].getName());
if (parameterTypes.length>k+ 1 ){
System.out.print("," );
}
}
System.out.println(")" );
}
Class[] args1 = new Class[2];
args1[0] = String.class;//对应方法的参数类型
args1[1] = int.class;//对应方法的参数类型
Method simpleMethod = simpleClass.getDeclaredMethod("print",
args1);
Object[] argments = new Object[2];//参数值
argments[0] = "Hello,Reflection!!!";
argments[1] = 2;
simpleMethod.invoke(simpelObject, argments);//方法调用
Class[] args2 = new Class[1];
args2[0] = String.class;//对应方法的参数类型
Method simpleMethod1 = simpleClass.getDeclaredMethod("print1",
args2);
//setAccessible方法,它是用来设置是否有权限访问反射类中的私有方法的,只有设置为true时才可以访问,默认为false
simpleMethod1.setAccessible(true);
String[] argments1 = new String[1];//参数值
argments1[0] = "Hello,Reflection!!!";
simpleMethod1.invoke(simpelObject, argments1);//方法调用
}
}
输出结果:
获取反射类中所有公有属性:
fields.length====>1
cl===>class java.lang.String
获取反射类中所有的属性:
fields1.length====>3
cl1===>class java.lang.String
cl1===>int
cl1===>int
获取反射类中私有的属:
i====>1
获取指定类的构造方法:
test.Simple()
test.Simple(java.lang.String )
获取指定类的所有方法
void print1(java.lang.String)
void print(java.lang.String,int)
2--测试---Hello,Reflection!!!
测试---Hello,Reflection!!!
初次接触java的反射机制,理解的不是很深,有不对的地方还望各位不惜赐教!!!