java反射
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java反射,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3133字,纯文字阅读大概需要5分钟。
内容图文
![java反射](/upload/InfoBanner/zyjiaocheng/737/c9efb41f38404152a3dd515db94706f9.jpg)
反射机制:
在运行状态中 对于任意一个类,都能够知道这个类的所有的属性和方法
获取class 的三种方式:
1、 Class clazz1 = Class.forName("com.heima.bean.Person"); // Class 的静态方法 通过全类名 获取运行类
2、 Class clazz2 = Person.class; // 通过.class文件
3、 Person p = new Person(); Class clazz3 = p.getClass(); // Object的getClass()方法
反射如何拿到构造方法: clazz.newInstance() //只能拿空参 Class clazz = Class.forName("com.heima.bean.Person"); Constructor c = clazz.getConstructor(String.class,int.class); //拿有参构造的对象 : 先获取类Class对象 ,然后用getConstructor(参数)
public class demon3_reflect { public static void main(String[] args) throws Exception { Class clazz = Class.forName("com.heima.bean.Person"); Constructor c = clazz.getConstructor(String.class,int.class); Person p = (Person) c.newInstance("张三",23); System.out.println(p); } }
public class demon2_reflect { public static void main(String[] args) throws Exception { Juicer j = new Juicer(); BufferedReader br = new BufferedReader(new FileReader("config.properity")); // 读取配置文件中的全类名(带包名的类名) 再用forName() 反射获取类 Class clazz = Class.forName(br.readLine()); fruit f = (fruit)clazz.newInstance(); // 获取到空参构造 父类引用指向子类对象 j.run(f); } } interface fruit { public abstract void squeeze(); } class Apple implements fruit{ public void squeeze() { System.out.println("炸出一杯苹果汁"); } } class Orange implements fruit{ public void squeeze() { System.out.println("炸出一杯juzi汁"); } } class Juicer { public void run(fruit f) { f.squeeze(); } }
通过反射 获取成员变量并使用
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import com.heima.bean.Person; public class demon4_field { /* * 反射 获取成员变量
Field f = clazz.getField("变量名")
f.set(对象名,变量名) // 改变变量值
如果 该变量被私有了,可以先 f.setAccessible(true) ,在调用set() 暴力反射 */ public static void main(String[] args) throws Exception { Class clazz = Class.forName("com.heima.bean.Person"); // 获取类对象 Constructor c = clazz.getConstructor(String.class,int.class); // clazz.getContructor(参数) 获取有参构造对象 Person p = (Person) c.newInstance("张三",23); // 通过有参构造,创建类对象 /*Field f = clazz.getField("name"); f.set(p, "李四");*/ Field f = clazz.getDeclaredField("name"); f.setAccessible(true); // 暴力反射 f.set(p, "李四"); System.out.println(p); } }
获取方法:
import java.lang.reflect.Constructor; import java.lang.reflect.Method; import com.heima.bean.Person; public class demon5_method { public static void main(String[] args) throws Exception { Class clazz = Class.forName("com.heima.bean.Person"); Constructor c = clazz.getConstructor(String.class,int.class); Person p = (Person) c.newInstance("张三",23); Method m = clazz.getMethod("eat"); //获取eat方法 m.invoke(p); Method m2 = clazz.getMethod("eat", int.class); // 获取带参数的 eat()方法 m2.invoke(p, 2); } }
内容总结
以上是互联网集市为您收集整理的java反射全部内容,希望文章能够帮你解决java反射所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。