import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @author Alina
* @date 2021年12月30日 10:47 下午
* JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,
* 都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java 语言的反射机制。
* 获取字节码文件的三种方式
* 1.new 对象后 使用getClass获取
* 2.使用静态属性class 获取
* 3.Class类的静态方法 forName()
* 4.获取所有公共构造方法
* 5.获取一个空参构造器
* 6.获取有参构造器
* 7.获取有参构造器简便方式:类中必有空参的public 权限的 class类中有newInstance()
* 8.获取一个带有参数的私有构造器,并运行
* 9.获取成员变量 从类中的class文件中获取成员变量 Field getFields()
* 10.获取成员方法 Method getMethod 运行获取到的方法 invoke
*/
public class ReflectDemo {
public static void main(String[] args)throws Exception {
// method_2();
method_10();
}
public static void method_10()throws Exception{
Class clazz10 = Class.forName("People");
Object obj = clazz10.newInstance();
// Method[] methods = clazz10.getMethods();
// for(Method m :methods){
// System.out.println(m);
// }
Method method = clazz10.getMethod("show"); // 获取空参方法
method.invoke(obj);
Method method1 = clazz10.getMethod("show",int.class,double.class);
method1.invoke(obj,10,12.34);
}
public static void method_9 () throws Exception{
Class clazz9 = Class.forName("People");
Object obj = clazz9.newInstance();
// Field[] fields = clazz9.getFields(); //获取所有共有权限的成员变量 获取私有的加Declared
// for (Field f : fields){
// System.out.println(f);
// }
Field filed = clazz9.getField("sex");
filed.set(obj,"女");
System.out.println(obj);
}
public static void method_8 ()throws Exception {
Class clazz8 = Class.forName("People");
Constructor con = clazz8.getDeclaredConstructor(String.class);
System.out.println(con);
//父类方法
con.setAccessible(true);
Object obj = con.newInstance("李四");
System.out.println(obj);
}
public static void method_7 ()throws Exception {
Class clazz7 = Class.forName("People");
System.out.println(clazz7.newInstance());
}
public static void method_6 ()throws Exception {
Class clazz6 = Class.forName("People");
Constructor con = clazz6.getConstructor(String.class,int.class);
Object obj = con.newInstance("张三",20);
System.out.println(obj);
}
public static void method_5 ()throws Exception {
Class clazz5 = Class.forName("People");
Constructor con = clazz5.getConstructor();
System.out.println(con);
}
public static void method_4 ()throws Exception {
Class class4 = Class.forName("People");
Constructor[] cons = class4.getConstructors();
for(Constructor com:cons){
System.out.println(com);
}
}
public static void method_3 () throws Exception {
Class class3 = Class.forName("People");
System.out.println(class3);
}
public static void method_2 (){
Class class2 = People.class;
System.out.println(class2);
}
public static void method_1(){
People p = new People();
Class class1 = p.getClass();
System.out.println(class1);
}
}