Java基础系列 - 泛型和反射机制

package com.test5;

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

/**
 * Java泛型和反射机制(泛型的好处 代码安全简单,自动装箱拆箱,提高代码的重用率)
 */
public class test5 {
    public static void main(String[] args) {
        Employer employer = new Employer(1000, "张三", 25);
        Ref<Employer> ref1 = new Ref<Employer>(employer);
        System.out.println("---------------------打印类信息-----------------------");
        ref1.printClassMethodMessage();
        System.out.println("---------------------打印类成员变量信息-----------------------");
        ref1.printFieldMessage();

        /* 打印显示
            ---------------------打印类信息-----------------------
            类的名称是:com.test5.Employer
            java.lang.String toString()
            java.lang.String getName()
            void setName(java.lang.String,)
            int getEid()
            int getAge()
            void setAge(int,)
            void setEid(int,)
            void wait(long,)
            void wait(long,long,int,)
            void wait()
            boolean equals(java.lang.Object,)
            int hashCode()
            java.lang.Class getClass()
            void notify()
            void notifyAll()
            ---------------------打印类成员变量信息-----------------------
            int eid
            java.lang.String name
            int age
         */
    }
}

/**
 * 泛型类
 * @param <T>
 */
class Ref<T> {
    private T o;

    //构造函数
    public Ref(T o) {
        this.o = o;
    }

    /**
     * 打印类的信息,包括类的成员函数,成员变量
     */
    public void printClassMethodMessage() {
        //要获取类的信息,首先要获取类的类类型
        Class c = o.getClass();//传递的是哪个子类的对象,c 就是子类的类类型
        //获取类的名称
        System.out.println("类的名称是:" + c.getName());

        /**
         * Method类,方法对象
         * 一个成员方法就是一个Method对象
         * getMethods()方法获取的是所有的public的函数,包括父类继承而来的
         * getDeclaredMethods()方法获取的是所有该类自己声明的方法,不问访问权限
         */
        Method[] methods = c.getMethods();//c.getDeclaredMethods()
        for (int i = 0; i < methods.length; i++) {
            //得到方法的返回值类型的类类型
            Class returnType = methods[i].getReturnType();
            System.out.print(returnType.getName() + " ");
            //打印方法名字
            System.out.print(methods[i].getName() + "(");
            Class<?>[] parameterTypes = methods[i].getParameterTypes();
            String para = "";
            for (Class class1 : parameterTypes) {
                para += class1.getName() + ",";
                System.out.print(para);
            }
            System.out.println(")");
        }
    }

    /**
     * 获取成员变量的信息
     */
    public void printFieldMessage() {
        Class c = o.getClass();
        /**
         * 成员变量也是对象
         * java.lang.reflect.Field
         * getFields()方法获取的是所有的public 的成员变量的信息
         * getDeclaredFields 获取的是该类自己声明的成员变量的信息
         */
        // Field[] fs = c.getFields();
        Field[] fs = c.getDeclaredFields();
        for (Field field : fs) {
            //得到成员变量的类型的类类型
            Class fieldType = field.getType();
            String typeName = fieldType.getName();
            //得到成员变量的名称
            String fieldName = field.getName();
            System.out.println(typeName + " " + fieldName);
        }
    }
}

class Employer {
    public Employer(int eid, String name, int age) {
        this.eid = eid;
        this.name = name;
        this.age = age;
    }

    private int eid;
    private String name;
    private int age;

    public int getEid() {
        return eid;
    }

    public void setEid(int eid) {
        this.eid = eid;
    }

    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;
    }

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

  

posted @ 2019-09-19 11:15  深南大道  阅读(264)  评论(0编辑  收藏  举报