该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
2020年10月16日
============================================================
//反射获取类的构造方法
public class Demo001 {
public static void main(String[] args) {
//第一步,获取类的类对象
try {
Class clz = Class.forName("com.hx.refrect.Person");
//clz就是Person这个类的类对象
//第二部,获取类的构造方法
//使用类的类对象的getConstructors()方法获取
//构造方法有无参构造,带参构造,带参构造有的是带一个参数,有的是带俩参数
//所以类的构造方法的返回值是多个
//类的对象的构造方法用Constructor类表示
Constructor[] constructors = clz.getConstructors();
//遍历构造方法
for (Constructor con:constructors) {
//打印构造方法的名称
System.out.println(con.getName()+":"+con.toString());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
============================================================
//利用反射技术创建对象
public class Demo002 {
public static void main(String[] args) throws Exception {
//第一步,获取类的类对象
Class> clz = Class.forName("com.hx.refrect.Person");
//第二步,获取类的构造方法
//获取无参构造方法
//获取无参构造方法使用类的类对象.getConstructors()
//由于是无参构造方法,所以不用传递的参数
Constructor> constructor = clz.getConstructor();
//第三步,使用构造方法创建Person对象
//创建对象使用newInstance()方法
Person person = (Person) constructor.newInstance();
//打印使用反射创建出来的对象
System.out.println(person.toString());
}
}
============================================================
//所谓的类的类对象,就是指在硬盘上的一个类的字节码文件加载到内存中,加载到JVM中,会生成一个类
//这个类就是类的类对象,用来表述类的父类,接口,属性,方法,构造方法
============================================================
//获取带参构造方法
public class Demo003 {
public static void main(String[] args) throws Exception{
//第一步获取类的类对象
//所谓的类的类对象,就是指在硬盘上的一个类的字节码文件加载到内存中,加载到JVM中,会生成一个类
//这个类就是类的类对象,用来表述类的父类,接口,属性,方法,构造方法
Class clz = Class.forName("com.hx.refrect.Person");
//第二步:获取类的带参构造方法
//使用类的类对象的clz.getConstructor()方法
//参数为Class类型
//什么是Class类型?按例子记忆,String类的Class类型就是String.class
//Integer的Class类型就是Integer.class
//那么获取带参构造的方法getConstructor()的参数是什么呢?
//查看Person的带参构造函数的参数,有两个,所以getConstructor()就要是2个参数
//什么类型呢?参数为Class类型,tring类的Class类型就是String.class
Constructor constructor = clz.getConstructor(String.class,int.class);
//第三步,使用构造方法的newInstance()方法创建对象
//由于是带参构造方法,带参构造方法创建对象都带有参数,所以要传递参数
Person person = (Person) constructor.newInstance("张三", 19);
//打印利用反射创建的对象
System.out.println(person);//打印结果 Person{name='张三', age=19}
}
}
============================================================
//利用反射创建带参对象
public class Demo004 {
public static void main(String[] args) throws Exception{
//获取类的类对象
Class clz = Class.forName("com.hx.refrect.Person");
//获取带参构造方法
//使用类的类对象的getConstructor()方法,参数为Class类型
//String的Class类型为String.class
Constructor constructor = clz.getConstructor(String.class, int.class);
//使用构造方法的getConstructor()方法获取带参对象
//由于是带参构造方法,所以创建对象时要传递参数
Person person = (Person) constructor.newInstance("张三封",19);
//打印创建的对象
System.out.println(person);//打印结果 Person{name='张三封', age=19}
}
}
============================================================
//使用反射获取类的方法
public class Demo006 {
public static void main(String[] args) throws Exception {
//第一步:获取类的类对象
Class clz = Class.forName("com.hx.refrect.Person");
//第二步,通过类的类对象获取Person类指定的方法
//1,获取Person类的count无参方法
//使用getMethod()方法,参数为String类型,参数值为方法的名称
Method countMethod = clz.getMethod("count");
//打印方法名称
System.out.println(countMethod.toString());
//打印结果
//public void com.hx.refrect.Person.count()
//2,获取Person类的size有参方法
//参数为方法名,参数的Class类型
Method sizeMethod = clz.getMethod("size", int.class);
//打印方法名称
System.out.println(sizeMethod.toString());
//打印结果
//public void com.hx.refrect.Person.size(int)
//3,获取Person类的私有无参方法
//使用类的类对象的getDeclaredMethod()方法
Method eatMethod = clz.getDeclaredMethod("eat");
//打印方法名称
System.out.println(eatMethod.toString());
//打印结果
//private void com.hx.refrect.Person.eat() 修饰符private
}
}
============================================================
//使用反射执行方法
public class Demo007 {
public static void main(String[] args) throws Exception {
//第一步,获取类的类对象
Class clz = Class.forName("com.hx.refrect.Person");
//第二步,获取Person类指定的方法
//参数为方法名和参数的Class类型
Method countMethod = clz.getMethod("count");
//第三步执行指定方法
//1,执行无参公共方法
//执行方法需要调用countMethod的invoke()方法,并且要传递参数
//参数为Person类对象,以及方法的参数的具体值
//获取Person类对象
//获取类对象需要获取到类的构造方法,或者直接使用类的类对象的newInstance方法
//得到的是无参构造方法生成的对象
Person person = (Person) clz.newInstance();
//利用反射调用对象的方法,使用的是方法的invoke()方法
//传递参数,第一个Person类的对象,第二个,本方法所需参数的具体值
//由于此时执行的是公共的无参方法,所以只需要传入Person类对象
countMethod.invoke(person);
//执行结果
//这是Person的无参公共方法
//2,执行有参公共方法
//首先获取指定的公共方法对象,使用类的类对象的getMethod()方法
//参数有两个,第一个获取那个参数,名称是什么,参数类型为String
//第二个参数,方法所需参数的Class类型
//使用方法对象的invoke()方法
//需要两个参数,第一个为Person类的对象,第二个为本方法的参数的具体值
//指定执行Person类的有参公共方法size()
//获取size()方法对象
Method sizeMethod = clz.getMethod("size", int.class);
//执行方法
sizeMethod.invoke(person,9);
//执行结果
// 这是Person的无参公共方法
// 这是Person的有参公共方法,参数值为:9
}
}
============================================================
//3,执行指定的私有方法
Method eatMethod = clz.getDeclaredMethod("eat");
//打开访问权限
eatMethod.setAccessible(true);
eatMethod.invoke(person);
//打印结果
//这是Person的无参私有方法 java学习QQ群:685439971
============================================================
//使用反射获取类的公有属性
public class Demo008 {
public static void main(String[] args) throws Exception {
//第一步,获取类的类对象
Class clz = Class.forName("com.hx.refrect.Person");
//第二步,获取指定类的类属性
//一个类不止一个属性,所以返回值是一个数组
Field[] fields = clz.getFields();
//便利这个数组
for (Field field : fields) {
//打印每个属性
System.out.println(field.toString());
}
}
}
//打印结果
//为空
//因为Person类的属性都是private修饰
============================================================
//使用反射获取类的私有属性
public class Demo009 {
public static void main(String[] args) throws Exception {
//第一步,获取类的类对象
Class clz = Class.forName("com.hx.refrect.Person");
//第二步获取类的私有属性
//使用类的类对象的getDeclaredFields()方法,获取所有的私有属性
Field[] declaredFields = clz.getDeclaredFields();
//遍历数组
for (Field declaredField : declaredFields) {
//System.out.println(declaredField);
}
Field nameField = clz.getDeclaredField("name");
System.out.println(nameField.toString());
Field ageField = clz.getDeclaredField("age");
System.out.println(ageField.toString());
//给属性赋值
//使用属性对象的set()方法
//该方法有两个参数,第一个是Person对象,第二个是想设置的值
//创建对象
Person person = (Person) clz.newInstance();
nameField.setAccessible(true);
nameField.set(person,"张三");
System.out.println("===================");
System.out.println(nameField.get(person));
}
}
//打印结果
//private java.lang.String com.hx.refrect.Person.name
//private int com.hx.refrect.Person.age
//张三