创建对应的运行时类的对象、获取运行时类的所有属性、方法

环境准备:
包结构:
这里写图片描述

========================
Person.java

package com.atguigu.java;

import java.io.Serializable;

public class Person extends Creature<String> implements Comparable,Serializable{
    String name;
    private int age;
    public String id;

    public Person() {
        super();
        System.out.println("Person()....");
    }

    private Person(String name){
        this.name = name;
    }

    public Person(String name, int age) {
        super();
        this.name = name;
        this.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;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

    @MyAnnotation("atguigu")
    public static void show() throws RuntimeException{
        System.out.println("我是一个人!");
    }

    @Override
    public int compareTo(Object o) {
        // TODO Auto-generated method stub
        return 0;
    }

    private void info(){
        System.out.println("君生我未生 我生君已老");
    }

    public String getNation(String nation,int year){
        System.out.println("nation : " + nation);
        return nation + "!!";
    }
}

=======================
Creature.java

package com.atguigu.java;

public class Creature<T> {//生物
    public double weight;//体重

    public void breath(){
        System.out.println("呼吸");
    }
}

==================
MyAnnotation.java

package com.atguigu.java;

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

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value() default "abc123";
}

==============================
测试:
创建对应的运行时类的对象(掌握)

创建对应的运行时类的对象(掌握)
package com.atguigu.java;

import java.lang.reflect.Constructor;

import org.junit.Test;

/*
 * 有了Class以后,反射的应用一:创建对应的运行时类的对象
 * 
 */
public class NewInstanceTest {

    @Test
    public void test1() throws InstantiationException, IllegalAccessException{
        Class clazz = Person.class;

        //创建Person类的对象
        /*
         * 调用newInstance():实际上就是调用了对应的运行时类的空参的构造器
         * 建议:我们在创建一个类的时候,尽量提供一个公共的无参的构造器
         *     其一,通过反射创建运行时类的对象时,要调用
         *     其二,子类对象实例化是,默认构造器的首行调用的是父类空参的构造器
         * 
         */
        Person p = (Person)clazz.newInstance();

        System.out.println(p);
    }

    /*
     * 调用对应的运行时类中指定的构造器。
     */
    @Test
    public void test2() throws Exception{
        Class clazz = Person.class;
        //1.获取指定的构造器
        Constructor cons = clazz.getDeclaredConstructor(String.class);
        //2.设置此构造器是可访问的
        //cons.setAccessible(true);
        //3.调用指定的构造器,创建对应的运行时类的对象
        Person p = (Person)cons.newInstance("HanMeimei");
        System.out.println(p);
    }
}

===============================
获取运行时类的所有属性

package com.atguigu.java;

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

import org.junit.Test;

public class FieldTest {

    @Test
    public void test1() throws ClassNotFoundException{
        Class clazz = Class.forName("com.atguigu.java.Person");

        //getFields():只能获取对应的运行时类及其所有的父类中声明为public的属性
        Field[] fields = clazz.getFields();
        for(int i = 0;i < fields.length;i++){
            System.out.println(fields[i]);
        }

        System.out.println();

        //getDeclaredFields():获取对应的运行时类自己定义的(不包含父类中的)所有的属性
        Field[] declaredFields = clazz.getDeclaredFields();
        for(int i = 0;i < declaredFields.length;i++){
            System.out.println(declaredFields[i]);
        }
    }
    //权限修饰符  数据类型 变量名
    @Test
    public void test2() throws ClassNotFoundException{
        Class clazz = Class.forName("com.atguigu.java.Person");
        Field[] declaredFields = clazz.getDeclaredFields();
        for(int i = 0;i < declaredFields.length;i++){
            //1.权限修饰符的获取
            int modifier = declaredFields[i].getModifiers();
            System.out.print(Modifier.toString(modifier) + "  ");

            //2.数据类型的获取
            Class type = declaredFields[i].getType();
            System.out.print(type.getName() + "  ");

            //3.变量名的获取
            System.out.println(declaredFields[i].getName());
        }
    }
}

==================================
获取运行时类的所有方法

package com.atguigu.java;

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

import org.junit.Test;

public class MethodTest {
    @Test
    public void test1() throws ClassNotFoundException {
        Class clazz = Class.forName("com.atguigu.java.Person");

        // getMethods():只能获取对应的运行时类及其所有的父类中声明为public的方法
        Method[] methods = clazz.getMethods();
        for (int i = 0; i < methods.length; i++) {
            System.out.println(methods[i]);
        }

        System.out.println();

        // getDeclaredMethods():获取对应的运行时类自己定义的(不包含父类中的)所有的
        Method[] methods1 = clazz.getDeclaredMethods();
        for (int i = 0; i < methods1.length; i++) {
            System.out.println(methods1[i]);
        }
    }

    // 注解
    // 权限修饰符 返回值类型 方法名 (形参列表) throws 异常类型
    @Test
    public void test2() throws ClassNotFoundException {
        Class clazz = Class.forName("com.atguigu.java.Person");
        Method[] methods1 = clazz.getDeclaredMethods();

        for (int i = 0; i < methods1.length; i++) {
            //0.注解
            Annotation[] anns = methods1[i].getAnnotations();
            //遍历
            for(int j = 0;j < anns.length;j++){
                System.out.println(anns[j]);
            }

            // 1.获取权限修饰符
            System.out.print(Modifier.toString(methods1[i].getModifiers()) + "  ");

            //2.获取返回值类型
            Class returnType = methods1[i].getReturnType();
            System.out.print(returnType.getName() + "  ");
            //3.方法名
            System.out.print(methods1[i].getName() + "(");

            //4.形参列表
            Class[] paramType = methods1[i].getParameterTypes();
            for(int j = 0;j < paramType.length;j++){
                if(j == paramType.length - 1){
                    System.out.print(paramType[j].getName() + " args_" + j);
                    break;
                }

                System.out.print(paramType[j].getName() + " args_" + j + ",");
            }

            System.out.print(")");
            //5.获取异常类型
            Class[] exps = methods1[i].getExceptionTypes();

            for(int j = 0;j < exps.length;j++){
                if(j == 0){
                    System.out.print("throws ");
                }
                System.out.print(exps[j].getName() + " ");
            }

            System.out.println();
        }   

    }
}
原文地址:https://www.cnblogs.com/lisingshen/p/7499733.html