java反射总结_java反射代码总结

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

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

//张三

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值