package day0204;
import java.lang.reflect.*;
public class TestReflection {
//利用反射实现一些常规操作
public static void main(String[] args) throws Exception{
/*
* 类对象.newInstance() 创建类的对象 但是此种方式在java9后就被弃用了
* 改用类对象.getDeclaredConstructor().newInstance()
* 有类对象 也有构造方法对象
* */
Class<?> c1 = new Student().getClass(); //获取本类对象
Object a = c1.getDeclaredConstructor().newInstance();
Class<?> c = Class.forName("day0204.Student"); //获取到Student类对象 <?>泛型通配符
//Object o =c.getDeclaredConstructor().newInstance(); //等于Student o = new Student()
//因为有重载构造方法 所以需要指定参数表 依次来获取对应的构造方法
Constructor con = c.getDeclaredConstructor(String.class,int.class);
//获取有参构造方法对象,然后通过newInstance来创建Student对象
Object o = con.newInstance("liucy",40); //等于Object o2 = new Student("liucy",40) 调用无参构造方法创建对象
System.out.println("----------------------------------------类对象调用 无参方法");
Method m1 = c.getMethod("study"); //获取无参study方法对象 注意这还只是对象而已 还没开始调方法
m1.invoke(o); //传入类的对象 类型是Object。等同于o.study()
System.out.println("----------------------------------------类对象调用 有参方法");
Method m2 = c1.getMethod("study"); //类对象.getMethod() 返回方法对象
Method m3 = c1.getMethod("study", String.class,int.class); //第二个参数 API要求传入参数类型的类对象 比如参数是String 那么该类对象就是String.class String是一个类名
Object result = m2.invoke(a); //调用无参方法 可以用Object接受返回内容 如果是void 则可以判断是不是void对象
System.out.println(result);
m3.invoke(o,"cc",20); //调用有参方法 此时调用的时候,记得要给方法传参
}
}
class Student{
String name;
int age;
//创建有参构造方法
public Student(String name, int age) {
this.name = name;
this.age = age;
System.out.println(name+age+"有参构造方法被调用");
}
//创建无参构造方法
public Student() {
super();
System.out.println("Student()无参构造方法被调用");
}
//有参学习方法
public int study(String name,int age) {
System.out.println(name+age+"岁,开始学习");
return 100;
}
//无参构造方法
public void study() {
System.out.println("开始学习了");
}
}
网友评论