注解与反射机制:获取运行时类的完整结构

图1:
在这里插入图片描述

实现目标:test07获取test01的完整结构

test01 源代码:

package wanwan.pachage;
//什么叫反射
public class test01 extends Object{
    public static void main(String[] args) throws ClassNotFoundException {
        //通过反射获取类的class对象
        Class c1 = Class.forName("wanwan.pachage.test01.user");
        Class c2 = Class.forName("wanwan.pachage.test01.user");
        Class c3 = Class.forName("wanwan.pachage.test01.user");
        Class c4 = Class.forName("wanwan.pachage.test01.user");
        System.out.println(c1);
        //一个类在内存中只有一个class对象
        //一个类被加载后,类的整个结构都会封装在class对象中
        System.out.println(c2.hashCode());
        System.out.println(c3.hashCode());
        System.out.println(c4.hashCode());
    }

}
//实体类:pojo,entity
class user{
    private String name;
    private int age;
    private int id;
    public user() {
    }

    public user(String name, int age, int id) {
        this.name = name;
        this.age = age;
        this.id = id;
    }

    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 int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "user{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", id=" + id +
                '}';
    }
}


test07 源代码:

package wanwan.pachage;

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

public class test07 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
        Class c1 = Class.forName("wanwan.pachage.user");

        user u = new user();
        c1 = u.getClass();

        //获得类的名字
        System.out.println(c1.getName());//获得包名+类名
        System.out.println(c1.getSimpleName());//获得类名
        System.out.println("=======================");
        //获得类的属性
       Field[] fields = c1.getFields();//只能找到public属性
        /*for (Field field : fields) {
            System.out.println(field);
        }-----未能输出,why?--->属性私有
        */
        fields = c1.getDeclaredFields();//找到全部的属性
        for (Field field : fields) {
            System.out.println(field);
        }
        //获得指定属性的值
        /*
         Field name = c1.getField("name");//会报错,思考为什么?-->只能找到public属性
        System.out.println(name);
         */

        Field name = c1.getDeclaredField("name");
        System.out.println(name);
        //l获得类的方法
        System.out.println("============================");
        Method[] methods = c1.getMethods();//获得本类及父类的全部public方法
        for (Method method : methods) {
            System.out.println("正常的:"+method);
        }
        System.out.println("============================");
        Method[] declaredMethods = c1.getDeclaredMethods();//获得本类的所有方法
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }
        System.out.println("==================================");
        //获得指定方法
        //重载
        Method getName = c1.getMethod("getName", null);
        Method setName = c1.getDeclaredMethod("setName", String.class);
        System.out.println(getName);
        System.out.println(setName);
        System.out.println("=========================");
        //获得指定的构造器
        Constructor[] constructors = c1.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
       constructors=c1.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            System.out.println("###"+constructor);
        }
        //获得指定的构造器
        Constructor declaredConstructor = c1.getDeclaredConstructor(String.class, int.class, int.class);
        System.out.println("指定:"+declaredConstructor);
    }
}

test07运行结果:

"C:\Program Files\Java\jdk1.8.0_221\bin\java.exe" "-javaagent:G:\IDEA\IntelliJ IDEA 2019.3.1\lib\idea_rt.jar=50156:G:\IDEA\IntelliJ IDEA 2019.3.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar;E:\我的程序人生\java\Reflection\out\production\Reflection" wanwan.pachage.test07
wanwan.pachage.user
user
=======================
private java.lang.String wanwan.pachage.user.name
private int wanwan.pachage.user.age
private int wanwan.pachage.user.id
private java.lang.String wanwan.pachage.user.name
============================
正常的:public java.lang.String wanwan.pachage.user.toString()
正常的:public java.lang.String wanwan.pachage.user.getName()
正常的:public int wanwan.pachage.user.getId()
正常的:public void wanwan.pachage.user.setName(java.lang.String)
正常的:public int wanwan.pachage.user.getAge()
正常的:public void wanwan.pachage.user.setAge(int)
正常的:public void wanwan.pachage.user.setId(int)
正常的: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 java.lang.String wanwan.pachage.user.toString()
public java.lang.String wanwan.pachage.user.getName()
public int wanwan.pachage.user.getId()
public void wanwan.pachage.user.setName(java.lang.String)
public int wanwan.pachage.user.getAge()
public void wanwan.pachage.user.setAge(int)
public void wanwan.pachage.user.setId(int)
==================================
public java.lang.String wanwan.pachage.user.getName()
public void wanwan.pachage.user.setName(java.lang.String)
=========================
public wanwan.pachage.user()
public wanwan.pachage.user(java.lang.String,int,int)
###public wanwan.pachage.user()
###public wanwan.pachage.user(java.lang.String,int,int)
指定:public wanwan.pachage.user(java.lang.String,int,int)

Process finished with exit code 0

发布了52 篇原创文章 · 获赞 10 · 访问量 3735

猜你喜欢

转载自blog.csdn.net/weixin_46047285/article/details/104398291