java反射实例_一篇文章看懂java反射机制(反射实例化对象-反射获得构造方法,获得普通方法,获得字段属性)...

Class> cls = Class.forName("cn.mldn.demo.Person"); //取得Class对象

传入一个包名+类名的字符串就可以得到Class对象

第一步:获得对象,构造方法,普通方法,属性

Object obj =cls.newInstance() //反射实例化对象

Constructor> cons =cls.getConstructor(String.class, int.class);//获得构造方法

Method m3= cls.getDeclaredMethod("getName"); //获得get方法

Field nameField =cls.getDeclaredField("name"); //获得name属性

第二步:获得之后---如何用的问题

1.    虽然用此方法创造的对象比new出来的复杂,但是有利于程序的解耦,增加扩展性 8/22框架技术都是通过此技术进行解耦操作的

2. Class> cls = Class.forName("cn.mldn.demo.Person"); // 取得Class对象

Constructor> cons = cls.getConstructor(String.class, int.class);

Object obj = cons.newInstance("张三", 20); // 为构造方法传递参数

System.out.println(obj); // Person [name=张三, age=20]

3.    Method m = cls.getDeclaredMethod("say"); //say是自己在类中自定义的方法

m.invoke(obj);//输出123456789,这个obj可以是new出来的或newInstance出来的

4. Object obj = Class.forName("Person").newInstance();

Field nameField = cls.getDeclaredField("name"); // 获得name属性nameField.setAccessible(true); //解除封装

nameField.set(obj, "张三"); // Person对象.name = "张三"

System.out.println(nameField.get(obj)); // Person对象.name

9/3日再学习

212edea47a2b1a51a500b2201f6641dc.png

servlet MVC框架的老祖宗

反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化对象,但是“反”指的是通过对象找到类。

packagecn.mldn.demo;

classPerson {}

publicclassTestDemo {

publicstaticvoidmain(String[] args) throwsException {

Person per = new Person() ; // 正着操作-由类到对象

System.out.println(per.getClass().getName()); // 反着来-由对象到类

}

}

以上的代码使用了一个getClass()方法,而后就可以得到对象所在的“包.类”名称,这就属于“反”了,但是在这个“反”的操作之中有一个getClass()就作为发起一切反射操作的开端。

Person的父类是Object类,而上面所使用getClass()方法就是Object类之中所定义的方法。

·取得Class对象:public final Class> getClass(),反射之中的所有泛型都定义为?,返回值都是Object。

而这个getClass()方法返回的对象是Class类的对象,所以这个Class就是所有反射操作的源头。但是在讲解其真正使用之前还有一个需要先解释的问题,既然Class是所有反射操作的源头,那么这个类肯定是最为重要的,而如果要想取得这个类的实例化对象,Java中定义了三种方式:

方式一:通过Object类的getClass()方法取得,基本不用:

packagecn.mldn.demo;

classPerson {}

publicclassTestDemo {

publicstaticvoidmain(String[] args) throwsException {

Person per = newPerson() ; // 正着操作

Class> cls = per.getClass() ; // 取得Class对象

System.out.println(cls.getName()); // 反着来

}

}

方式二:使用“类.class”取得,在日后学习Hibernate开发的时候使用

packagecn.mldn.demo;

classPerson {}

publicclassTestDemo {

publicstaticvoidmain(String[] args) throwsException {

Class> cls = Person.class; //取得Class对象

System.out.println(cls.getName()); // 反着来

}

}

方式三:使用Class类内部定义的一个static方法,主要使用

·取得Class类对象:public static Class> forName(String className) throws ClassNotFoundException;

packagecn.mldn.demo;

classPerson {}

publicclassTestDemo {

publicstaticvoidmain(String[] args) throwsException {

Class> cls = Class.forName("cn.mldn.demo.Person") ; // 取得Class对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值