关于反射机制的一些示例
2017-07-10 21:43
260 查看
通过一个对象获得一个完整的包名和类名
实例化Class类对象
通过Class实例化其他类的对象
*如果把Person类中的无参构造函数取消,就会出现错误。
所以在编写使用Class实例化其他类对象的时候,一定要定义一个无参的构造器。*
通过Class调用类中的构造器
返回一个类实现的接口和继承的父类
获取类的全部属性
调用类的方法
package com.ntqingniao.reflect; public class Client2 { public static void main(String[] args) { Demo demo = new Demo(); // 根据对象获取完整的包名和类名 System.out.println(demo.getClass().getName()); } } class Demo2 { }
实例化Class类对象
package com.ntqingniao.reflect; public class Client3 { public static void main(String[] args) throws ClassNotFoundException { // Class类是所有对象的元数据的类对象 Class<?> demo1 = null; Class<?> demo2 = null; Class<?> demo3 = null; demo1 = Class.forName("com.ntqingniao.reflect.Demo3"); demo2 = new Demo3().getClass(); demo3 = Demo3.class; System.out.println(demo1.getName()); System.out.println(demo2.getName()); System.out.println(demo3.getName()); } } class Demo3 { }
通过Class实例化其他类的对象
package com.ntqingniao.reflect; public class Client4 { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { Class<?> demo = null; // 通过类全名创建Class对象(类型的工厂) demo = Class.forName("com.ntqingniao.reflect.Person"); // 调用工厂的newInstance()方法创建对象 Person per = (Person)demo.newInstance(); per.setName("Tom"); System.out.println(per); } } class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [" + (name != null ? "name=" + name + ", " : "") + "age=" + age + "]"; } }
*如果把Person类中的无参构造函数取消,就会出现错误。
所以在编写使用Class实例化其他类对象的时候,一定要定义一个无参的构造器。*
通过Class调用类中的构造器
// 获取该类的所有构造器对象 Constructor<?> cons[] = demo.getConstructors(); // 通过构造器对象的newInstance(Object.. params)可变参数方法构建对象 Person per1 = (Person)cons[0].newInstance(); Person per2 = (Person)cons[1].newInstance("Tom", 20); System.out.println(per1); System.out.println(per2);
返回一个类实现的接口和继承的父类
// 获取类的所有接口和直接父类方法 Class<?> inters[] = demo.getInterfaces(); Class<?> supers = demo.getSuperclass();
获取类的全部属性
// 获取类的全部属性 Field[] fields = demo.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { // 获取权限修饰符 int mo = fields[i].getModifiers(); String priv = Modifier.toString(mo); // 数据类型 Class<?> type = fields[i].getType(); // 属性变量名 String name = fields[i].getName(); System.out.println(priv + " " + type.getName() + " " + name ); }
调用类的方法
Method method = demo.getMethod("getName"); method.invoke(demo.newInstance()); Person p = new Person(); Method method2 = demo.getMethod("getName", String.class); method2.invoke(p, "Reflect"); p.getName("Reflect");
相关文章推荐
- 关于Java反射机制中的Field简单尝试与示例以及说明
- 关于线程的一些概念和关于线程返回值的简单示例代码
- Java中的反射机制(五) 关于Class类的补充说明
- 关于Java反射机制的一个实例
- 关于java反射的一些理解
- 关于List中FindAll用法的一些简单示例
- 1118关于C语言中内存计算,和一些运算符以及scanf和printf运行机制
- 黑马程序员-关于反射的一些小总结
- 关于反射机制(Reflect)
- 关于JS解析机制、作用域的一些总结
- 关于IOS一些有的没的 – IOS Runtime机制
- 关于java反射机制
- 关于 回调 、 反射 和异步的一些理解---初级知识
- 关于Java的反射机制,你需要理解这些...
- 关于java反射机制的理解(转自知乎)
- 使用.Net Reflection 反射机制 动态获取对象字段内容的示例
- 关于Java反射机制
- 关于java反射的一些代码
- 黑马程序员关于反射机制总结
- 关于java反射的一些小栗子