package Reflect;
public interface Move {
void moveType();
}
package Reflect;
public interface Study {
void studyInfo();
}
package Reflect;
public class Person {
public String name;
public int age;
}
package Reflect;
public class Student extends Person implements Move,Study{
public Student(){
System.out.println(“无参构造”);
}
public Student(String school){
System.out.println(“public有参构造”);
this.school=school;
}
private Student (String name,int age){
System.out.println(“private 有参构造”);
this.name=name;
this.age=age;
}
String school;
public void showInfo(){
System.out.println("学校是: "+this.school);
}
@Override
public void moveType() {
System.out.println(“学习知识”);
}
@Override
public void studyInfo() {
System.out.println("开车学习");
}
}
package Reflect;
import java.lang.reflect.Constructor;
public class Test1 {
public static void main(String[] args) {
try {
Class clazz = Class.forName(“Reflect.Student”);
// //通过包名.类名的字符串,调用class. forName方法获取指定类的class实例
// Class superClazz=clazz.getSuperclass(); //获取父类
// System.out.println("父类是 "+superClazz.getName());
//
// Class[] interfaces = clazz.getInterfaces();//获取当前类的所有接口
// for (Class c : interfaces){
// System.out.println("接口是 "+c.getName());
// }
// Constructor [] cons = clazz.getConstructors();//获取到类的公有的构造方法
// for (Constructor c : cons){
// System.out.println("构造方法是 "+c.getName());//获取构造方法名称
// //getModifiers()获取修饰符 返回数组1代表public
// System.out.println("构造方法是 "+c.getName()+"修饰符是 "+c.getModifiers());
// Class[] paramClazz = c.getParameterTypes();
// for (Class pc : paramClazz){
// System.out.println("构造方法是 "+c.getName()+“参数类型是 “+pc.getName());
// }
// }
// System.out.println(”----------------------------------------------”);
// Constructor [] cons1 = clazz.getDeclaredConstructors();//获取类的所有构造方法,包括公有和私有的
// for (Constructor c : cons1){
// System.out.println("构造方法是 "+c.getName());//获取构造方法名称
// //getModifiers()获取修饰符 返回数组2代表private
// System.out.println("构造方法是 "+c.getName()+"修饰符是 "+c.getModifiers());
// Class[] paramClazz = c.getParameterTypes();
// //获取构造方法的参数类型,有几个参数数组的元素就有几个
// for (Class pc : paramClazz){
// System.out.println("构造方法是 "+c.getName()+"参数类型是 "+pc.getName());
// }
// }
//如何用反射的构造方法来创建对象
Object obj = clazz.newInstance(); //相当于调用student类的无参公有的构造方法
// Student stu = (Student) obj;
// Constructor c = clazz.getConstructor(String.class);
// //指定获取有一个参数并且为string类型的公有的构造方法
// Student stu1 = (Student) c.newInstance(“aa”);
// //newInstance实例化对象,相当于调用public Student(String school)
// System.out.println(stu1.school);
//通过反射机制,可以强制的调用私有的构造方法
Constructor c = clazz.getDeclaredConstructor(String.class,int.class);//指定获取有两个参数 String.class,int.class
c.setAccessible(true);//解除私有的封装,下面就可以对这个私有方法强制
Student stu = (Student)c.newInstance(“张三”,18);
//指定获取有两个参数
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}