JAVA中通过反射机制获取父类和接口
public class SuperTest01 {
public static void main(String[] args) throws Exception{
Class c = Class.forName("java.lang.String");
//获取父类
Class superName = c.getSuperclass();
System.out.println(superName.getName());
//获取接口
Class[] interfaces = c.getInterfaces();
for (Class in : interfaces){
System.out.println(in.getName());
}
}
}
通过私有构造方法创建对象
public static void reflectPrivateConstructor() {
try {
//1、
Class<?> cl = Class.forName("Student");
/*//2、获取的是不带有参数的构造方法
Constructor<?> constructor = cl.getConstructor();
Student student = (Student) constructor.newInstance();
System.out.println(student);*/
//getConstructor 获取的公有的构造方法
//getDeclaredConstructor:获取的是所有的构造方法
Constructor<?> constructor =
cl.getDeclaredConstructor(String.class,int.class);
//以后再反射私有的东西的时候,如果要进行修改:setAccessible(true);
constructor.setAccessible(true);
Student student = (Student) constructor.newInstance("eryueniao",18);
System.out.println(student);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
获取私有属性和私有方法
public static void reflectPrivateField() {
try {
//1、
Class<?> cl = Class.forName("Student");
Field field = cl.getDeclaredField("name");
field.setAccessible(true);
Student student = (Student) cl.newInstance();
System.out.println(student);
field.set(student,"eryueniao");
System.out.println(student);
System.out.println(field.get(student));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
public static void reflectPrivateMethod() {
try {
//1、
Class<?> cl = Class.forName("Student");
//2、
Method method = cl.getDeclaredMethod("function",String.class);
//String.class是方法参数类型
Method[] methods = cl.getDeclaredMethods();
method.setAccessible(true);
Student student = (Student) cl.newInstance();
method.invoke(student,"eryueniao");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}