利用java的反射机制可以将只获得类名的类实例化
存在一个类名为Reflect的类,有俩个属性和俩个方法,类如下:
public class Reflect {
//定义俩个不同类型的属性
private String name;
public int age;
//定义俩个不同类型的方法
private void fun1(){
System.out.println("这是第一个方法");
}
public static final void fun2(String name, int age){
System.out.println("这是第二个方法");
System.out.println(name + "***" + age);
}
}
测试java的反射机制:
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TestReflect {
//获取类全名
static String className = "com.xjtuse.homework.testReflect.Reflect";
public static void main(String[] args) {
try {
//对获得的类实例化
Class clazz = Class.forName(className);
Object o =clazz.newInstance();
//返回类的所有方法
Method[] ms = clazz.getDeclaredMethods();
for(Method m : ms){
//返回方法的名字
System.out.println(m.getName());
//返回方法的修饰符
/*PUBLIC: 1
PRIVATE: 2
PROTECTED: 4
STATIC: 8
FINAL: 16
SYNCHRONIZED: 32
VOLATILE: 64
TRANSIENT: 128
NATIVE: 256
INTERFACE: 512
ABSTRACT: 1024
STRICT: 2048*/
System.out.println(m.getModifiers());
//设置private方法可以访问
m.setAccessible(true);
//获取方法的参数
Class[] parameter = m.getParameterTypes();
if(parameter.length == 0){
//没有参数
m.invoke(o, null);
}else{
//有参数
Object[] ob = new Object[parameter.length];
int index = 0;
for(Class p:parameter){
if(p.getName().equals("int")){
ob[index] = 1;
}
else if(p.getName().equals("java.lang.String")){
ob[index] = "aaa";
}
index ++;
}
m.invoke(o, ob);
}
}
//返回所有属性
Field[] fs = clazz.getDeclaredFields();
for(Field f : fs){
//私有属性可见
f.setAccessible(true);
if(f.getType().getName().equals("int")){
f.set(o,100);
}else if(f.getType().getName().equals("java.lang.String")){
f.set(o, "bbb");
}
System.out.println(f.get(o));
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出结果: