通过反射获取构造方法,成员变量及成员方法
2017-02-25 00:41
609 查看
1.获取字节码文件对象的三种方式:
A:Object类的getClass()方法
B:数据类型的静态class属性(Java中的每一种数据类型都会有这个静态属性)
C:Class类的静态方法forName(String name):全类名
2.通过反射的方式如何获取构造方法:
1、获取类的字节码文件对象
2.获取构造方法对应的对象
3.使用构造方法
3.通过反射获取成员变量并使用
public Field[] getFields()获取公有的成员变量
public Field[] getDeclaredFields()获取全部的成员变量,包括私有
public Field getDeclaredField(String name) 传入变量名称返回指定的成员变量对象,包括私有
public Field getField(String name)传入变量名称返回指定的成员变量对象,仅可获取公有的
public void set(Object obj,Object value) 给一个对象的一个字段设置一个值
4.通过反射获取成员方法并使用
public Method[] getMethods()获取所有公共成员方法,包括父类
public Method[] getDeclaredMethods()获取所有成员方法,包括私有
public Method getMethod(String name, Class)
案例:我给你ArrayList的一个对象,我想在这个集合中添加一个字符串数据,如何实现呢?
A:Object类的getClass()方法
B:数据类型的静态class属性(Java中的每一种数据类型都会有这个静态属性)
C:Class类的静态方法forName(String name):全类名
public class ReflectDemo { public static void main(String[] args) throws Exception { Person person1 = new Person(); Person person2 = new Person(); System.out.println(person1 == person2); // A:Object类的getClass()方法 Class class1 = person1.getClass(); Class class2 = person2.getClass(); System.out.println(class1 == class2); // B:数据类型的静态class属性(java中的每一种数据类型都会有这个静态属性)(类名.class) Class class3 = Person.class; System.out.println(class1 == class3); // C:Class类的静态方法forName(String name):全类名(Class.forName("全类名");) Class class4 = Class.forName("com.edu.Person"); System.out.println(class1 == class4); } }
public class Person { // 定义成员变量 String name; public int age; private String address; // 定义构造方法 public Person() { } private Person(String name) { this.name = name; } protected Person(String name, int age, String address) { this.name = name; this.age = age; this.address = address; } // 定义成员方法 public void show() { System.out.println("public show"); } private void method() { System.out.println("private method"); } void function() { System.out.println("function"); } protected String getString(String s1, String s2, String s3) { return s1 + s2 + s3; } @Override public String toString() { return "Person [name= 4000 " + name + ", age=" + age + ", address=" + address + "]"; } }
2.通过反射的方式如何获取构造方法:
1、获取类的字节码文件对象
2.获取构造方法对应的对象
3.使用构造方法
import java.lang.reflect.Constructor; public class ReflectConstructorDemo { public static void main(String[] args) throws Exception { // 获取类的字节码文件对象 Class fm = Class.forName("com.edu.Person"); // 获取构造方法对应的对象 // public Constructor<?>[] getConstructors(),仅仅能够获取公有的构造 // public Constructor<?>[] getDeclaredConstructors(),获取所有构造,包括私有 // Constructor con = fm.getConstructor(); // System.out.println(con); // Constructor[] con = fm.getDeclaredConstructors(); // for (Constructor con1 : con) { // System.out.println(con1); // } // Constructor con = // forName.getDeclaredConstructor(String.class,int.class,String.class); // System.out.println(con); Constructor con = fm.getDeclaredConstructor(String.class, int.class, String.class); // 暴力反射 con.setAccessible(true); // 使用构造方法 Object obj = con.newInstance("诸葛亮", 30, "卧龙坡"); System.out.println(obj); } }
3.通过反射获取成员变量并使用
public Field[] getFields()获取公有的成员变量
public Field[] getDeclaredFields()获取全部的成员变量,包括私有
public Field getDeclaredField(String name) 传入变量名称返回指定的成员变量对象,包括私有
public Field getField(String name)传入变量名称返回指定的成员变量对象,仅可获取公有的
public void set(Object obj,Object value) 给一个对象的一个字段设置一个值
import java.lang.reflect.Constructor; import java.lang.reflect.Field; public class ReflectFiledDemo { public static void main(String[] args) throws Exception { // 获取字节码文件对象 Class fm = Class.forName("com.edu.Person"); // 获取构造函数对象 Constructor con = fm.getConstructor(); Object obj = con.newInstance(); // 获取成员变量 // public Field[] getFields()获取公有的成员变量 // Field[] fie = fm.getFields(); // for (Field field : fie) { // System.out.println(field); // } // public Field[] getDeclaredFields()获取全部的成员变量,包括私有 // Field[] fie = fm.getDeclaredFields(); // for (Field field : fie) { // System.out.println(field); // } // public Field getDeclaredField(String name) 传入变量名称返回指定的成员变量对象,包括私有 Field addressField = fm.getDeclaredField("address"); Field nameField = fm.getDeclaredField("name"); Field ageField = fm.getDeclaredField("age"); nameField.setAccessible(true); addressField.setAccessible(true); // public Field getField(String name)传入变量名称返回指定的成员变量对象,仅可获取公有的 // Field fie = fm.getField("age"); // System.out.println(fie); // // public void set(Object obj,Object value) 给一个对象的一个字段设置一个值 nameField.set(obj, "诸葛亮"); ageField.set(obj, 50); addressField.set(obj, "卧龙坡"); System.out.println(obj); } }
4.通过反射获取成员方法并使用
public Method[] getMethods()获取所有公共成员方法,包括父类
public Method[] getDeclaredMethods()获取所有成员方法,包括私有
public Method getMethod(String name, Class)
import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class ReflectMethodDemo { public static void main(String[] args) throws Exception { // 创建字节码文件对象 Class fm = Class.forName("com.edu.Person"); // 创建构造函数对象 Constructor con = fm.getDeclaredConstructor(); Object obj = con.newInstance(); // public Method[] getMethods()获取所有公共成员方法,包括父类 // Method[] methods = fm.getMethods(); // for (Method method : methods) { // System.out.println(method); // } // public Method[] getDeclaredMethods()获取所有成员方法,包括私有 // Method[] methods = fm.getDeclaredMethods(); // for (Method method : methods) { // System.out.println(method); // } // public Method getMethod(String name, Class<?>... parameterTypes) // 参数一:方法名 参数二:方法参数类型.class 获取指定的公共方法 // Method method = fm.getMethod("show"); // Method method = fm.getMethod("show"); // System.out.println(method); // public Method getDeclaredMethod(String name,Class<?>... // parameterTypes) // 参数一:方法名 参数二:方法参数类型.class 获取指定的方法,包括私有 Method method = fm.getDeclaredMethod("getString", String.class, String.class, String.class); method.setAccessible(true); // Object invoke(Object obj, Object... args) 让某一个对象使用这个方法,并且传入参数 Object objString = method.invoke(obj, "诸葛亮", "住在", "卧龙坡"); System.out.println(objString); } }
案例:我给你ArrayList的一个对象,我想在这个集合中添加一个字符串数据,如何实现呢?
import java.lang.reflect.Method; import java.util.ArrayList; public class ArrayReflect { public static void main(String[] args) throws Exception { ArrayList<Integer> arrayList = new ArrayList<Integer>(); // 获取字节码文件对象 Class class1 = arrayList.getClass(); // 获取add(E e)方法原型 Method method = class1.getDeclaredMethod("add", Object.class); // 添加字符串 method.invoke(arrayList, "java"); method.invoke(arrayList, "world"); method.invoke(arrayList, "hello"); System.out.println(arrayList); } }
相关文章推荐
- 反射_通过反射获取成员变量、构造方法、成员方法的使用
- 反射(三)之通过反射获取构造方法, 成员变量, 成员方法
- java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。
- Java SE练习 - 反射获取对象构造方法、成员变量、成员方法
- Android(java)学习笔记109:通过反射获取成员变量和成员方法并且使用
- javaBean的概述和规范;BeanUtils的概述;BeanUtils的常用方法:获取类的字节码文件;通过类的构造方法获取成员变量;暴力访问 setAccessible(true)
- 通过反射获取类的类名,方法和内部成员变量
- 反射机制的概述和字节码对象的获取,通过反射获取构造方法并使用;通过反射获取成员变量并使用;通过反射获取私有成员变量并使用;通过反射获取成员方法并使用
- java反射之获取方法,成员变量,构造方法
- Java 通过反射获取类的信息(成员变量,成员方法,构造方法)
- 黑马程序员--Java基础加强--16.利用反射操作泛型V【通过Constructor反射解析泛型构造方法】【通过Field反射解析泛型成员变量】【个人总结】
- java反射2-获取构造方法、成员变量、成员方法
- 反射_通过反射获取成员变量并使用
- 通过反射获取构造方法,属性,方法信息
- C#--反射使用Start!-获取对象的字段/属性/方法/成员/构造方法
- Java(通过反射获取成员变量并使用)
- Java学习提要——"反射"获取方法信息(成员函数、成员变量 、构造函数)
- 反射:通过反射获取成员变量并使用
- [javaSE] 反射-获取类的成员属性和构造方法
- 通过反射获取成员变量并使用