通过反射获取构造方法,成员变量及成员方法

来源:互联网 发布:香港域名注册處 编辑:程序博客网 时间:2024/05/20 16:11

1.获取字节码文件对象的三种方式:
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=" + 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);    }}
0 0
原创粉丝点击