【Java】Class对象功能代码实现

链接: Class对象功能图文版
链接: 反射案例实现

Class对象功能代码实现

获取功能:

  1. 获取成员变量

    • Field[] getFields()【获取所有public类型成员变量】

    • Field getField(String name)

    • Field[] getDeclaredFields()

    • Field getDeclaredField(String name)

  2. 获取构造方法

    • Constructor getConstructor(类<?>… parameterTypes)

    • Constructor<?>[] getConstructors()

    • Constructor getDeclaredConstructor(类<?>… parameterTypes)

    • Constructor<?>[] getDeclaredConstructors()

  3. 获取成员方法

    • 方法 getDeclaredMethod(String name, 类<?>… parameterTypes)

    • 方法[] getDeclaredMethods()

    • 方法 getEnclosingMethod()

    • 方法 getMethod(String name, 类<?>… parameterTypes)

    • 方法[] getMethods()

  4. 获取类名

    • String getName()

获取成员变量

设置值:set(Object obj,Object value)【将指定对象参数上的此Field对象表示的字段设置为指定的新值】

获取值:get(Object obj)【返回该所表示的字段的值Field,指定的对象上】

package com.yuhang.reflect;

import com.yuhang.domain.Person;

import java.lang.reflect.Field;

public class ReflectDemo2 {
    /**
     *### 获取功能:
     *
     * 1. 获取成员变量
     *    - Field[] getFields()
     *    - Field getField(String name)
     *    - Field[] getDeclaredFields()
     *    - Field getDeclaredField(String name)
     */
    public static void main(String[] args) throws Exception {
        //1.获取Person的Class对象
        Class personClass = Person.class;

        //Field[] getFields()
        Field[] fields = personClass.getFields();//加载public类型成员变量
        for (Field field : fields) {
            System.out.println(field);//public java.lang.String com.yuhang.domain.Person.a
            System.out.println(field.getName());//a
        }


        System.out.println("---------------");
        //Field getField(String name)
        Field a = personClass.getField("a");//加载public类型成员变量
        System.out.println(a);//public java.lang.String com.yuhang.domain.Person.a
        //获取方法1
        Person person = new Person();
        Object o = a.get(person);
        System.out.println(o);//null
        a.set(person,"hah");
        Object o1 = a.get(person);
        System.out.println(o1);//hah
        //方法2
        Person person1 = new Person();
        Object o2 = a.get(person1);
        System.out.println(o2);//null
        a.set(person1,"2");
        System.out.println(person1);//Person{name='null', age='null', a='2', b='null', c='null', d='null'}

        System.out.println("---------------");
        //Field[] getDeclaredFields()
        Field[] declaredFields = personClass.getDeclaredFields();//加载所有成员变量
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
            System.out.println(declaredField.getName());
        }

        System.out.println("---------------");
        // Field getDeclaredField(String name)
        Field d = personClass.getDeclaredField("d");
        System.out.println(d);//private java.lang.String com.yuhang.domain.Person.d
//        Object o3 = d.get(person);
//        System.out.println(o3);//不能访问私有
        //忽略修饰符安全监测
        d.setAccessible(true);//暴力反射
        Object o3 = d.get(person);
        System.out.println(o3);//null

    }
}

[Person]

package com.yuhang.domain;

public class Person {
    private String name;
    private String age;

    public String a;
    protected String b;
    String c;
    private String d;

    public Person() {
    }

    public Person(String name, String age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", a='" + a + '\'' +
                ", b='" + b + '\'' +
                ", c='" + c + '\'' +
                ", d='" + d + '\'' +
                '}';
    }
}

获取构造方法

newInstance(Object… initargs)【 使用此 Constructor对象表示的构造函数,使用指定的初始化参数来创建和初始化构造函数的声明类的新实例。】

package com.yuhang.reflect;

import com.yuhang.domain.Person;

import java.lang.reflect.Constructor;

public class ReflectDemo3 {
    /**
     *### 获取功能:
     * 2. 获取构造方法
     *    - Constructor<T> getConstructor(类<?>... parameterTypes)
     *    - Constructor<?>[] getConstructors()
     *    - Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
     *    - Constructor<?>[] getDeclaredConstructors()
     */
    public static void main(String[] args) throws Exception {
        //1.获取Class对象
        Class personClass = Person.class;

        //Constructor<T> getConstructor(类<?>... parameterTypes)
        Constructor constructor = personClass.getConstructor();
        System.out.println(constructor);//public com.yuhang.domain.Person()
        System.out.println(constructor.getName());//com.yuhang.domain.Person

        Constructor constructor1 = personClass.getConstructor(String.class,String.class);
        System.out.println(constructor1);//public com.yuhang.domain.Person(java.lang.String,java.lang.String)
        System.out.println(constructor1.getName());//com.yuhang.domain.Person

        Object zhangsan = constructor1.newInstance("zhangsan", "1");//使用此 Constructor对象表示的构造函数,使用指定的初始化参数来创建和初始化构造函数的声明类的新实例。
        System.out.println(zhangsan);//Person{name='zhangsan', age='1', a='null', b='null', c='null', d='null'}
        //私有报错
//        Constructor constructor2 = personClass.getConstructor(int.class);
//        System.out.println(constructor2);
//        System.out.println(constructor2.getName());

        System.out.println("--------------");
        //Constructor<?>[] getConstructors()
        Constructor[] constructors = personClass.getConstructors();
        for (Constructor constructors1 : constructors) {
            System.out.println(constructors1);
            //public com.yuhang.domain.Person()
            //public com.yuhang.domain.Person(java.lang.String,java.lang.String)
            System.out.println(constructors1.getName());
            //com.yuhang.domain.Person
            //com.yuhang.domain.Person
        }

        System.out.println("--------------");
        //Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
        Constructor declaredConstructor = personClass.getDeclaredConstructor();
        System.out.println(declaredConstructor);//public com.yuhang.domain.Person()
        System.out.println(declaredConstructor.getName());//com.yuhang.domain.Person
        Constructor constructor2 = personClass.getDeclaredConstructor(String.class);
//        constructor2.setAccessible(true);
        System.out.println(constructor2);
        System.out.println(constructor2.getName());
        constructor2.setAccessible(true);//暴力反射
        Object hahh = constructor2.newInstance("hahh");//给值  私有hahh
//        System.out.println(hahh);

        System.out.println("--------------");
        //Constructor<?>[] getDeclaredConstructors()
        Constructor[] declaredConstructors = personClass.getDeclaredConstructors();
        for (Constructor declaredConstructors1 : declaredConstructors) {
            System.out.println(declaredConstructors1);
            //private com.yuhang.domain.Person(java.lang.String)
            //public com.yuhang.domain.Person(java.lang.String,java.lang.String)
            //public com.yuhang.domain.Person()
        }
    }
}

[Person]

package com.yuhang.domain;

public class Person {
    private String name;
    private String age;

    public String a;
    protected String b;
    String c;
    private String d;
    private String  e;

    public Person() {
    }

    public Person(String name, String age) {
        this.name = name;
        this.age = age;
    }
    
    private Person(String e){
        this.e = e;
        System.out.println("私有"+e);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", a='" + a + '\'' +
                ", b='" + b + '\'' +
                ", c='" + c + '\'' +
                ", d='" + d + '\'' +
                ", e='" + e + '\'' +
                '}';
    }
}

获取成员方法

invoke(Object obj, Object… args)【 在具有指定参数的 方法对象上调用此 方法对象表示的底层方法。 】

package com.yuhang.reflect;

import com.yuhang.domain.Person;

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

public class ReflectDemo4 {
    /**
     *### 获取功能:
     * 3. 获取成员方法
     *    - 方法 getDeclaredMethod(String name, 类<?>... parameterTypes)
     *    - 方法[] getDeclaredMethods()
     *    - 方法 getEnclosingMethod()
     *    - 方法 getMethod(String name, 类<?>... parameterTypes)
     *    - 方法[] getMethods()
     */
    public static void main(String[] args) throws Exception {
        //1.获取Class对象
        Class personClass = Person.class;

        //方法[] getMethods()
        Method method = personClass.getMethod("getName");
        System.out.println(method);//public java.lang.String com.yuhang.domain.Person.getName()
        System.out.println(method.getName());//getName
        
        Method look = personClass.getMethod("look");
        Person person = new Person();
        look.invoke(person);//看
        Method look1 = personClass.getMethod("look", int.class);
        look1.invoke(person,134);//看134


        //私有不可
//        Method method1 = personClass.getMethod("getName1");
//        System.out.println(method1);
//        System.out.println(method1.getName());

        System.out.println("----------------");
        //方法 getMethod(String name, 类<?>... parameterTypes)
        Method[] methods = personClass.getMethods();
        for (Method method1 : methods) {
            System.out.println(method1);
            //public java.lang.String com.yuhang.domain.Person.toString()
            //public java.lang.String com.yuhang.domain.Person.getName()
            //public void com.yuhang.domain.Person.setName(java.lang.String)
            //public void com.yuhang.domain.Person.setAge(java.lang.String)
            //public java.lang.String com.yuhang.domain.Person.getAge()
            //public final void java.lang.Object.wait() throws java.lang.InterruptedException
            //public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
            //public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
            //public boolean java.lang.Object.equals(java.lang.Object)
            //public native int java.lang.Object.hashCode()
            //public final native java.lang.Class java.lang.Object.getClass()
            //public final native void java.lang.Object.notify()
            //public final native void java.lang.Object.notifyAll()
            //自己的所有public成员方法,还有Object类的方法
        }

        System.out.println("----------------");
        //方法[] getDeclaredMethods()
        Method declaredMethod = personClass.getDeclaredMethod("getName1");
        System.out.println(declaredMethod);//private void com.yuhang.domain.Person.getName1()
        System.out.println(declaredMethod.getName());//getName1
        
        Method eat = personClass.getDeclaredMethod("eat");
        Person person1 = new Person();
        eat.setAccessible(true);//暴力反射
        eat.invoke(person1);//chi

        System.out.println("----------------");
        //方法 getDeclaredMethod(String name, 类<?>... parameterTypes)
        Method[] declaredMethods = personClass.getDeclaredMethods();
        for (Method declaredMethod1 : declaredMethods) {
            System.out.println(declaredMethod1);
            //public java.lang.String com.yuhang.domain.Person.toString()
            //public java.lang.String com.yuhang.domain.Person.getName()
            //public void com.yuhang.domain.Person.setName(java.lang.String)
            //private void com.yuhang.domain.Person.getName1()
            //public void com.yuhang.domain.Person.setAge(java.lang.String)
            //public java.lang.String com.yuhang.domain.Person.getAge()
            //自己的所有方法
        }
    }
}

[Person]

package com.yuhang.domain;

public class Person {
    private String name;
    private String age;

    public String a;
    protected String b;
    String c;
    private String d;
    private String  e;

    public Person() {
    }

    public Person(String name, String age) {
        this.name = name;
        this.age = age;
    }
    private Person(String e){
        this.e = e;
        System.out.println("私有"+e);
    }

    public String getName() {
        return name;
    }

    private void getName1(){}

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", a='" + a + '\'' +
                ", b='" + b + '\'' +
                ", c='" + c + '\'' +
                ", d='" + d + '\'' +
                ", e='" + e + '\'' +
                '}';
    }

    public void look(){
        System.out.println("看");
    }

    public void look(int a){
        System.out.println("看"+a);
    }

    private void eat(){
        System.out.println("chi");
    }
}

获取类名

String name = personClass.getName();
        System.out.println(name);//com.yuhang.domain.Person

2021年9月29日10:34:05

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就爱喝菠萝啤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值