网站首页 > java教程 正文
Java反射机制,是在程序运行期间,对任意一个类,都能知道这个类的所有属性和方法,其主要相关类包括java.lang.Class、java.lang.reflect.Constructor、java.lang.reflect.Field、java.lang.reflect.Method四个类,通过这几个类,可以获取程序运行期间,类的所有相关信息。
1. java.lang.Class
用于描述类信息的类,其中包含了对应类的所有信息,通过该对象可以获取类的构造器Constructor、域Field、方法Method这几个对象。
/** * @ClassName:Demo3 * @Description:反射机制实现的重要类之一 Class<T> */ public class Demo3 { /* * 获取一个类的Class对象的三种方法: * 1.通过类的相关对象获取 * 2.通过类名获取 * 3.通过静态方法Class.forName(String name) */ public static void main(String[] args) { Demo1 demo1=new Demo1(); Class c1=demo1.getClass(); System.out.println(c1.toString()); Class c2=Demo1.class; System.out.println(c2.toString()); //Class对象只会有一个 System.out.println("c1==c2?"+(c1==c2)); System.out.println("c1.equals(c2)?"+c1.equals(c2)); try { Class c3=Class.forName("About_Reflect.Demo2"); System.out.println(c3.toString()); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
2. java.lang.reflect.Constructor
/** * @ClassName:Demo4 * @Description:反射机制实现的重要类之一 Constructor<T> 构造器对象类 */ public class Demo4 { public static void main(String[] args) { try { //依据传入的参数来判断获取哪一个具体的构造器类,但此方法不能获取私有构造器 Constructor c1=test.class.getConstructor();//获取无参构造器 Constructor c2=test.class.getConstructor(int.class);//获取int类型参数的构造器 //通过构造器对象生成类对象 test t1=(test) c1.newInstance(); test t2=(test) c2.newInstance(1); //获取所有的可访问的构造器类 Constructor[] cs=test.class.getConstructors(); for(Constructor con:cs){ System.out.println(con); } //获取所有的构造器,即使是私有权限的,但是不能通过私有权限的构造器来生成对象 for(Constructor con:test.class.getDeclaredConstructors()){ System.out.println(con); } //通过私有权限构造器进行实例化对象 Constructor c3=test.class.getDeclaredConstructor(String.class);//通过指定参数类型来获取对应的构造器方法 c3.setAccessible(true);//为true表示取消反射时访问权限检测 c3.newInstance("s"); //获取构造方法对象的方法参数类型以及参数个数 int pcount=c3.getParameterCount(); Class[] classes=c3.getParameterTypes(); System.out.println("该构造方法有"+pcount+"个参数,参数类型分别是:"); for(Class<?> c:classes){ System.out.println(c.getTypeName()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } class test{ public test(){ System.out.println("test构造器1"); } public test(int i){ System.out.println("test构造器2:"+i); } private test(String s){ System.out.println("test构造器3"); } }
3. java.lang.reflect.Field
/** * @ClassName:Demo5 * @Description:反射机制实现的重要类之一 Field 域对象类 */ public class Demo5 { public static void main(String[] args) throws Exception { //获取所有的public权限的域 Field[] f1=test4.class.getFields(); for(Field f:f1){ System.out.println(f); } //通过变量名获取指定成员变量 Field fn=test4.class.getField("s1"); System.out.println(fn); //获取所有声明的域,不论权限 Field[] f2=test4.class.getDeclaredFields(); for(Field f:f2){ System.out.println(f); } //设置域的值 Object obj=test4.class.newInstance(); fn.set(obj, "ss"); } } class test4{ private int i1; public String s1; protected char c1; public static int i2; float f1; }
4. java.lang.reflect.Method
/** * @ClassName:Demo6 * @Description:反射机制实现的重要类之一 Method 成员方法类 */ public class Demo6 { public static void main(String[] args) throws Exception { //获取public权限方法 Method[] m1=test5.class.getMethods(); for(Method m:m1){ System.out.println(m); } //获取所有声明的方法 Method[] m2=test5.class.getDeclaredMethods(); for(Method m:m2){ System.out.println(m); } //依据方法名以及参数类型表来获取对应的方法对象 Method m3=test5.class.getMethod("setI", int.class);//有参方法 Method m4=test5.class.getMethod("add");//无参方法 //执行方法 Object obj=test5.class.newInstance(); Method m5=test5.class.getMethod("setS", String.class); m5.invoke(obj, "s"); } } class test5{ private int i; private String s; public void setI(int i){ this.i=i; } public void setS(String i){ s=i; } private String add(){ return i+s; } public String out(){ return add(); } }
5. 关于集合的泛型擦除机制
/** * @ClassName:Demo7 * @Description:重要特性:擦除,即类型信息擦除,主要体现在集合应用中 * @author: * @date:2018年4月17日 */ public class Demo7 { public static void main(String[] args) throws Exception { //只需记住一点:程序在编译成字节码文件后,文件中会擦除所有类型参数信息到它的边界,默认为Object //或者通过extends指定,而在生成字节码文件前无法插入对应类型的数据是因为编译器检查时的泛型约束 //所以直接通过Class对象来获取方法进行操作便可进行,如下例 ArrayList<Integer> arr=new ArrayList<Integer>(); arr.add(1); arr.add(2); //arr.add("3");编译错误,编译器报错,不能向泛型为Integer类型的集合中添加String类型的数据 //通过编译后生成的字节码文件对应的Class对象来操作 //可以实现向泛型为Integer类型的集合中添加String类型的数据 //因为在程序运行时,集合的泛型被擦除到边界,比如Integer被擦除为Object类型, //所以在运行时,集合是可以放入任何数据的 Method add=arr.getClass().getMethod("add",Object.class); add.invoke(arr, "3"); System.out.println(arr); } }
6. 利用反射实现通过配置文件来实现类的实例化以及方法调用
public class Demo8 { public static void main(String[] args) throws Exception { //1.准备配置文件,键值对或xml文件(xml文件需要特殊的读取方法) //2.IO流读取文件内容 Properties pro=new Properties(); pro.load(Demo8.class.getResourceAsStream("config.properties")); //3.读取类名,通过反射得到Class对象 String className=pro.getProperty("class"); //4.获取Class对象所代表的类的对象 Class c=Class.forName(className); Object obj=c.newInstance(); //5.获取某个方法 Method m=c.getMethod("out"); //6.执行 m.invoke(obj); } } class test8{ public void out(){ System.out.println("vn"); } }
猜你喜欢
- 2024-09-12 学习java应该如何理解反射?(怎么理解java反射)
- 2024-09-12 Java反射详解(java反射总结)
- 2024-09-12 读懂框架设计的灵魂—Java 反射机制
- 2024-09-12 Java的反射机制(java的反射机制是什么)
- 2024-09-12 java反射机制Java反射机制是什么?原理详解
- 2024-09-12 聊一聊Java当中的反射机制(java的反射机制是什么)
- 2024-09-12 Java反射机制的理解(java反射机制的理解和认识)
- 2024-09-12 聊一聊Java的反射机制?(java的反射机制是什么)
- 2024-09-12 Java学习之二——JAVA反射机制(java 反射机制原理)
- 2024-09-12 实操讲解Java的反射机制,你要是再看不懂,神仙都没救了
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)