首页 > 编程 > Java > 正文

java反射

2019-11-08 20:14:56
字体:
来源:转载
供稿:网友

概念

通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法

获取class文件对象的方式

Object类的getClass()方法数据类型的静态属性classClass类中的静态方法(开发常用) forName(String className)

示例:

public class Person { PRivate String name; int age; public String address; public Person() { } private Person(String name) { this.name = name; } Person(String name, int age) { this.name = name; this.age = age; } public Person(String name, int age, String address) { this.name = name; this.age = age; this.address = address; } public void show() { System.out.println("show"); } public void method(String s) { System.out.println("method " + s); } public String getString(String s, int i) { return s + "---" + i; } private void function() { System.out.println("function"); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", address=" + address + "]"; }}// 方式1Person p = new Person();Class c = p.getClass();Person p2 = new Person();Class c2 = p2.getClass();System.out.println(p == p2);// falseSystem.out.println(c == c2);// true// 方式2Class c3 = Person.class;System.out.println(c == c3);// true// 方式3 (开发常用)Class c4 = Class.forName("com.xxx.Person");System.out.println(c == c4);// true

构造方法

public class ReflectDemo { public static void main(String[] args) throws Exception { // 获取字节码文件对象 Class c = Class.forName("com.xxx.Person"); //public //空构造 Constructor con = c.getConstructor();// 返回的是构造方法对象 Object obj = con.newInstance(); //带参数构造 Constructor con = c.getConstructor(String.class, int.class,String.class); Object obj = con.newInstance("bingo", 18, "北京"); // private Constructor con = c.getDeclaredConstructor(String.class); con.setaccessible(true);// 暴力访问,值为true则指示反射的对象在使用时应该取消java语言访问检查。 Object obj = con.newInstance("test"); }}

成员变量

public class ReflectDemo { public static void main(String[] args) throws Exception { // 获取字节码文件对象 Class c = Class.forName("com.xxx.Person"); Constructor con = c.getConstructor();// 返回的是构造方法对象 Object obj = con.newInstance(); // public Field addressField = c.getField("address"); addressField.set(obj, "北京"); // 给obj对象的addressField字段设置值为"北京" // private Field nameField = c.getDeclaredField("name"); nameField.setAccessible(true); nameField.set(obj, "bingo"); }}

成员方法

public class ReflectDemo { public static void main(String[] args) throws Exception { // 获取字节码文件对象 Class c = Class.forName("com.xxx.Person"); Constructor con = c.getConstructor();// 返回的是构造方法对象 Object obj = con.newInstance(); //第一个参数表示的方法名,第二个参数表示的是方法的参数的class类型 Method m2 = c.getMethod("method", String.class); m2.invoke(obj, "hello");// 调用方法 //public // 方法不带参数 Method m1 = c.getMethod("show"); m1.invoke(obj); // 调用obj对象的m1方法 // 方法带参数 Method m3 = c.getMethod("getString", String.class, int.class); Object objString = m3.invoke(obj, "hello", 100); // private Method m4 = c.getDeclaredMethod("function"); m4.setAccessible(true); m4.invoke(obj); }}

示例:在ArrayList中添加一个字符串数据

public class ArrayListDemo { public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { // 创建集合对象 ArrayList<Integer> array = new ArrayList<Integer>(); Class c = array.getClass(); // 集合ArrayList的class文件对象 Method m = c.getMethod("add", Object.class); m.invoke(array, "hello"); // 调用array的add方法,传入的值是hello m.invoke(array, "world"); m.invoke(array, "java"); System.out.println(array); }}public class Tool { public void setProperty(Object obj, String propertyName, Object value) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { // 根据对象获取字节码文件对象 Class c = obj.getClass(); // 获取该对象的propertyName成员变量 Field field = c.getDeclaredField(propertyName); // 取消访问检查 field.setAccessible(true); // 给对象的成员变量赋值为指定的值 field.set(obj, value); }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表