Java 反射技术:(二)反射机制动态操作_方法_属性_构造器

反射机制动态操作_方法_属性_构造器

    • 1.获取类的名字
    • 2.获得类的属性
    • 3.获得类的方法
    • 4.获得构造方法
    • 5.动态的操作属性、方法、构造方法

1.获取类的名字

序号 方法 描述
1 String getName() 获得包名+类名
2 String getSimpleName() 获得类的名字

实体类:

import java.io.Serializable;

public class Person implements Serializable {
    private String name;
    private int age;
    public Person() {
        super();
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + 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;
    }
}

测试代码:

public class Text{
    public static void main(String[] args) throws ClassNotFoundException {
        //获取类的名称
        Class c=Class.forName("Person");
        System.out.println("类的全名称:"+c.getName());
        System.out.println("类的名称:"+c.getSimpleName());
        //获取父类的Class对象
        Class cSuper=c.getSuperclass();
        System.out.println(cSuper.getName());
        System.out.println(cSuper.getSimpleName());
    }
}

运行结果:
Java 反射技术:(二)反射机制动态操作_方法_属性_构造器_第1张图片

2.获得类的属性

序号 方法 描述
1 Field getField(String fieldName) 得到公共的属性对象
2 Field getDeclareField(String fieldName) 得到指定名称的属性对象
3 Field []c.getDeclaredFields() 得到所有的属性对象

测试代码:

import java.lang.reflect.Field;

public class Text{
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
        //获取类的名称
        Class c=Class.forName("Person");
        //获取类的属性信息
        Field f=c.getDeclaredField("name"); //指定名称的属性对象
        System.out.println(f);
        Field[] fields=c.getFields(); //只能获取公共的属性
        System.out.println(fields.length);
        Field [] fields2=c.getDeclaredFields();//所有的属性对象
        for (Field field : fields2) {
            System.out.println(field.getModifiers()+"\t"+field.getType()+"\t"+field.getName());
        }

    }
}

运行结果:
Java 反射技术:(二)反射机制动态操作_方法_属性_构造器_第2张图片

3.获得类的方法

序号 方法 描述
1 Method[] getDeclaredMethods() 得到公共的方法对象
2 Method[] c.getMethods() 得到父类及本类
3 Method getDeclaredMethod(String methodName, Class …type) 得到指定名称的本类中公共的方法
4 Method getMethod(String methodName, Class type) 得到本类或父类中的公共的方法对象

测试代码:

import java.lang.reflect.Method;

public class Text{
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
        //获取类的名称
        Class c=Class.forName("Person");
        Method[] methods=c.getDeclaredMethods(); //本类中的公共的方法对象
        System.out.println(methods.length);
        for (Method method : methods) {
            System.out.println("访问权限"+method.getModifiers());
            System.out.println("返回值类型:"+method.getReturnType());
            System.out.println("方法的名称:"+method.getName());
            //获取方法的参数
            Class [] cPara=method.getParameterTypes();
            for (Class c1 : cPara) {
                System.out.println(c1.getTypeName()+"\t");
            }
            System.out.println("\n--------------------");
        }
        System.out.println("\n================\n");
    }
}

运行结果:
Java 反射技术:(二)反射机制动态操作_方法_属性_构造器_第3张图片

4.获得构造方法

序号 方法 描述
1 Constructor[] getDeclaredConstructors() 得到公共的构造方法的对象
2 Constructor [] getConstructors() 得到公共的构造方法对象
3 Constructor getDeclaredConstructor(Class…type) 得到指定参数的公共的构造方法 对象

测试代码:

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class Text{
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
        //获取类的名称
        Class c=Class.forName("Person");
        Constructor[] cons=c.getConstructors();
        for (Constructor constructor : cons) {
            System.out.println(constructor);
        }
        System.out.println("\n==================");
        //获取指定的构造方法
        Constructor con=c.getConstructor(null);
        System.out.println(con);
        System.out.println("\n==================");
        Constructor con2=c.getConstructor(String.class,int.class);//类中元素的数据类型
        System.out.println(con2);

    }
}

运行结果:
Java 反射技术:(二)反射机制动态操作_方法_属性_构造器_第4张图片

5.动态的操作属性、方法、构造方法

测试代码:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Text{
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
        //获取类的名称
        Class c=Class.forName("Person");
        //得到无参构造方法的对象
        Constructor cons=c.getConstructor(null);
        //通过无参构造方法的对象,创建Person类的对象
        Person person=(Person) cons.newInstance();
        //动态操作属性
        Field field=c.getDeclaredField("age");
        field.setAccessible(true);//这个属性不需要做安全检查了,可以直接访问
        field.set(person, 1001);  //通过反射直接赋值
        System.out.println("取出userId这个属性的值:"+field.get(person));//通过反射直接取值
        //动态操作方法
        Method m=c.getDeclaredMethod("setName", String.class);
        //执行setName这个方法
        m.invoke(person, "李四");
        Method m2=c.getDeclaredMethod("getName", null);
        System.out.println(m2.invoke(person));
    }
}

运行结果:
Java 反射技术:(二)反射机制动态操作_方法_属性_构造器_第5张图片

你可能感兴趣的:(Java基础深化与提高)