一篇关于反射的文章:(具体在代码注释中)
package com.wisdom.mix.localhost;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import com.hikvision.artemis.sdk.enums.Method;
public class JzpTest {
public static void main(String[] args) {
//反射的作用一获取私有类的方法或者属性
Test test = new Test();
Class cls = test.getClass();
Constructor[] constructors;
//返回类的所有构造方法
constructors = cls.getDeclaredConstructors();
for(int i = 0;i<constructors.length;i++) {
//构造方法的类型getModifiers
System.out.println(Modifier.toString(constructors[i].getModifiers())+"参数");
//得到构造方法的所有参数getParameterTypes
Class[] parameterTypes = constructors[i].getParameterTypes();
for(int j = 0;j<parameterTypes.length;j++) {
System.out.println(parameterTypes[j].getName()+"");
}
System.out.println("-");
}
System.out.println("-------------------一阶段 得到了类中所有构造方法和构造方法中的参数----------------------");
System.out.println("?????如何获取特定的构造方法呢");
//获取无参数的构造方法。
try {
Constructor constructor = cls.getDeclaredConstructor();
System.out.println(Modifier.toString(constructor.getModifiers()));
} catch (NoSuchMethodException e) {
//可能存在没有构造方法的参数
e.printStackTrace();
}
//获取有两个参数分别为int和String类型的构造方法
Class[] p = {int.class,String.class};
try {
Constructor constructor = cls.getDeclaredConstructor(p);
System.out.println(Modifier.toString(constructor.getModifiers()));
} catch (Exception e) {
// TODO: handle exception
}
// 调用构造方法(关键)
//借助于newInstance方法
//调用public
Class[] pri = {String.class};
Object o = null;
try {
Constructor constructorss = cls.getDeclaredConstructor(pri);
//这句话告诉设置权限
constructorss.setAccessible(true);
o = constructorss.newInstance("juzhongpeng");
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException 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();
}
//调用类的私有方法
Class[] cInstance = {String.class};
try {
java.lang.reflect.Method method = cls.getDeclaredMethod("str", cInstance);
method.setAccessible(true);
Object arg[] = {"高手都是低调且有内涵的"};
try {
method.invoke(test, arg);
Field field = cls.getDeclaredField("y");
field.setAccessible(true);
field.set(o,"地表最强码者");
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
打印结果如下: