反射的各种获取

package com.person;

/**
 * @author 21115 @ date 2021/8/25
 */
public interface MyInterface {

    void show();
}

package com.person;

import static java.lang.annotation.ElementType.*;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author 21115 @ date 2021/8/25
 */
// ctrl+n 快速查找类和各种文件 SuppressWarnings
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value() default "hello";
}

package com.person;

import java.io.Serializable;

/**
 * @author 21115 @ date 2021/8/25
 */
public class Creature<T> implements Serializable {

    private char gender;
    public double weight;

    private void breath() {
        System.out.println("生物呼吸");
    }

    public void eat() {
        System.out.println("生物吃东西");
    }
}

package com.person;

/**
 * @author 21115 @ date 2021/8/25
 */
// 改变值
@MyAnnotation(value = "hi")
public class Person extends Creature<String> implements Comparable<String>, MyInterface {

    private String name;
    int age;
    public int id;

    public Person() {}

    @MyAnnotation(value = "abc")
    private Person(String name) {
        this.name = name;
    }

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

    @MyAnnotation
    private String show(String nation) {
        System.out.println("我的国籍是: " + nation);
        return nation;
    }

    public String display(String interests, int age) {
        return interests + age;
    }

    @Override
    public void show() {
        System.out.println("我是一个人");
    }

    @Override
    public int compareTo(String o) {
        return 0;
    }
}

package com.person2;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

import org.junit.Test;

import com.person.Person;

/**
 * 获取当前运行时类的属性结构
 */
public class FieldTest {

    @Test
    public void test1() {

        Class clazz = Person.class;

        // 获取属性结构
        // getFields():获取当前运行时类及其父类中声明为 public 访问权限的属性
        Field[] fields = clazz.getFields();
        for (Field f : fields) {
            System.out.println(f);
        }
        // public int com.person.Person.id
        // public double com.person.Creature.weight

        // getDeclaredFields():获取当前运行时类中声明的所有属性。(不包含父类中声明的属性)
        Field[] declaredFields = clazz.getDeclaredFields();
        for (Field f : declaredFields) {
            System.out.println(f);
        }
        // private java.lang.String com.person.Person.name
        // int com.person.Person.age
        // public int com.person.Person.id
    }

    // 权限修饰符 数据类型 变量名
    @Test
    public void test2() {
        Class clazz = Person.class;
        Field[] declaredFields = clazz.getDeclaredFields();
        for (Field f : declaredFields) {
            // 1.权限修饰符
            int modifier = f.getModifiers();
            System.out.println(Modifier.toString(modifier) + "\t");
            // private
            // java.lang.String
            // name

            // 2.数据类型
            Class type = f.getType();
            System.out.println(type.getName() + "\t");
            // int
            // age

            // 3.变量名
            String fName = f.getName();
            System.out.println(fName);
            // public
            // int
            // id

            System.out.println();
        }
    }
}

package com.person2;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

import org.junit.Test;

import com.person.Person;

/**
 * @author 21115 @ date 2021/8/25
 */
public class MethodTest {

    @Test
    public void test1() {

        Class clazz = Person.class;

        // getMethods():获取当前运行时类及其所有父类中的声明为 public 权限的方法
        Method[] methods = clazz.getMethods();
        for (Method m : methods) {
            System.out.println(m);
        }
        // public int com.person.Person.compareTo(java.lang.String)
        // public int com.person.Person.compareTo(java.lang.Object)
        // public void com.person.Person.show()
        // public java.lang.String com.person.Person.display(java.lang.String)
        // public void com.person.Creature.eat()
        // 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 java.lang.String java.lang.Object.toString()
        // 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()

        System.out.println();

        // getDeclaredMethods(): 获取当前运行时类中声明的所有方法.(不包含父类中声明的方法)
        Method[] declaredMethods = clazz.getDeclaredMethods();
        for (Method m : declaredMethods) {
            System.out.println(m);
        }
        // public int com.person.Person.compareTo(java.lang.String)
        // public int com.person.Person.compareTo(java.lang.Object)
        // public void com.person.Person.show()
        // private java.lang.String com.person.Person.show(java.lang.String)
        // public java.lang.String com.person.Person.display(java.lang.String)
    }

    /**
     * @Xxxx 权限修饰符 返回值类型 方法名(参数类型1 形参名1,...) throws XxxException{}
     */
    @Test
    public void test2() {

        Class clazz = Person.class;
        Method[] declaredMethods = clazz.getDeclaredMethods();

        for (Method m : declaredMethods) {

            // 1.获取方法声明的注解
            Annotation[] annos = m.getAnnotations();
            for (Annotation a : annos) {
                System.out.println(a);
            }

            // 2.权限修饰符
            System.out.print(Modifier.toString(m.getModifiers()) + "\t");

            // 3.返回值类型
            System.out.print(m.getReturnType().getName() + "\t");

            // 4.方法名
            System.out.print(m.getName());
            System.out.print("(");

            // 5.形参列表
            Class[] parameterTypes = m.getParameterTypes();
            if (!(parameterTypes == null && parameterTypes.length == 0)) {
                for (int i = 0; i < parameterTypes.length; i++) {

                    if (i == parameterTypes.length - 1) {
                        System.out.print(parameterTypes[i].getName() + " args_" + i + ",");
                        break;
                    }

                    System.out.print(parameterTypes[i].getName() + " args_" + i + ",");
                }
            }
            System.out.print(")");

            // 6.抛出的异常
            Class[] exceptionTypes = m.getExceptionTypes();
            if (exceptionTypes.length > 0) {
                System.out.println("throws");
                for (int i = 0; i < exceptionTypes.length; i++) {
                    if (i == exceptionTypes.length - 1) {
                        System.out.println(exceptionTypes[i].getName());
                        break;
                    }
                    System.out.println(exceptionTypes[i].getName() + ",");
                }
            }

            System.out.println();
        }
        // public int compareTo(java.lang.String args_0,)
        // public volatile int compareTo(java.lang.Object args_0,)
        // public void show()
        // @com.person.MyAnnotation(value=hello)
        // private java.lang.String show(java.lang.String args_0,)
        // public java.lang.String display(java.lang.String args_0,int args_1,)
    }
}

package com.person;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import org.junit.Test;

/**
 * @author 21115 @ date 2021/8/26
 */
public class OtherTest {

    /**
     * 获取构造器结构
     */
    @Test
    public void test1() {

        Class clazz = Person.class;
        // getConstructors(): 获取当前运行时类中声明为 public 的构造器
        Constructor[] constructors = clazz.getConstructors();
        for (Constructor c : constructors) {
            System.out.println(c);
        }

        System.out.println();
        // getDeclaredConstructors(): 获取当前运行时类中声明的所有的构造器
        Constructor[] declareConstructors = clazz.getDeclaredConstructors();
        for (Constructor c : declareConstructors) {
            System.out.println(c);
        }
    }

    /**
     * 获取运行时类的父类
     */
    @Test
    public void test2() {
        Class clazz = Person.class;

        Class superclass = clazz.getSuperclass();
        System.out.println(superclass);
    }

    /**
     * 获取运行时类的带泛型的父类
     */
    @Test
    public void test3() {
        Class clazz = Person.class;

        Type genericSuperclass = clazz.getGenericSuperclass();
        // com.person.Creature<java.lang.String>
        System.out.println(genericSuperclass);
    }

    /**
     * 获取运行时类的带泛型的父类的泛型
     * 
     * 代码:逻辑性代码 vs 功能性代码
     */
    @Test
    public void test4() {
        Class clazz = Person.class;

        Type genericSuperclass = clazz.getGenericSuperclass();
        ParameterizedType paramType = (ParameterizedType)genericSuperclass;
        // 获取泛型类型
        Type[] actualTypeArguments = paramType.getActualTypeArguments();
        // class java.lang.String
        System.out.println(actualTypeArguments[0]);
        // java.lang.String
        System.out.println(actualTypeArguments[0].getTypeName());
        // java.lang.String
        System.out.println(((Class)actualTypeArguments[0]).getName());
    }

    /**
     * 获取运行时类实现的接口
     */
    @Test
    public void test5() {
        Class clazz = Person.class;

        Class[] interfaces = clazz.getInterfaces();
        for (Class c : interfaces) {
            System.out.println(c);
        }
        // interface java.lang.Comparable
        // interface com.person.MyInterface

        System.out.println();
        // 获取运行时类的父类实现的接口
        Class[] interfaces1 = clazz.getSuperclass().getInterfaces();
        for (Class c : interfaces1) {
            System.out.println(c);
        }
        // interface java.io.Serializable
    }

    /**
     * 获取运行时类的包
     */
    @Test
    public void test6() {
        Class clazz = Person.class;

        Package pack = clazz.getPackage();
        // package com.person
        System.out.println(pack);
    }

    /**
     * 获取运行时类声明的注解
     */
    @Test
    public void test7() {
        Class clazz = Person.class;

        Annotation[] annotations = clazz.getAnnotations();
        for (Annotation annos : annotations) {
            System.out.println(annos);
        }
        // @com.person.MyAnnotation(value=hi)
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值