【类反射】类的解剖(获取类的定义信息)

本文深入探讨Java反射机制,介绍如何通过反射获取类的方法、构造器及属性字段等关键信息,并提供详细的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

★ 获取类的方法

找出一个类中定义了些什么方法,这是一个非常有价值也非常基础的反射用法。

代码演示:

package cn.hncu.reflect.two;

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

import org.junit.Test;

/**
 * 
 *@author <a"283505495@qq.com">lxd</a>
 *@version 1.0 2017-4-19 下午5:11:01
 *@fileName ReflectDecompose.java
 */
public class ReflectDecompose{
    private static final String clsName = "cn.hncu.reflect.two.UserModel";

    // 获取类中所有方法(非构造方法)的信息
    @Test
    public void demo1() throws Exception{
        Class clazz = Class.forName(clsName);
        //getDeclaredMethods:获取当前类中声明的所有方法,包括私有的  ---不包括父类中的方法
        //Method ms[] = clazz.getDeclaredMethods();

        /*getMethods:获取当前类及其父类的所有public方法(不包括访问权限以外的方法)---
        相当于:UserModel user=new UserModel(); 该user对象在此处所能调用的那些方法*/
        Method ms[] = clazz.getMethods();
        for(Method m:ms){
            System.out.println(m.toGenericString());
            System.out.println("name:"+ m.getName());//方法名
            System.out.println("DeclaringClass:"+ m.getDeclaringClass());//方法是在哪个类中声明的

            //方法的参数类型列表
            Class paramTypes[] = m.getParameterTypes();
            for(int i=0;i<paramTypes.length;i++){
                Class c = paramTypes[i];
                System.out.println("param"+i+":"+c);
            }

            //方法所抛出的异常列表
            Class exceps[]= m.getExceptionTypes();
            for(int i=0;i<exceps.length;i++){
                Class c = exceps[i];
                System.out.println("excep"+i+":"+c);
            }

            //返回类型
            System.out.println("returnType:"+ m.getReturnType());

            //修饰符(private static final synchronized)
            int modifier = m.getModifiers();
            System.out.println("修饰符:"+ Modifier.toString(modifier));

            System.out.println("-----------");
        }
    }

★ 获取类的构造器

找出一个类中定义的构造方法,构造器没有返回类型。

代码演示:

// 获取类中所有构造方法的信息  ---提醒一个知识点: 子类是不会继承父类  构造方法(构造器) 的
    @Test
    public void demo2() throws Exception{
        Class clazz = Class.forName(clsName);
        //Constructor cons[] = clazz.getDeclaredConstructors();//获取当前类中声明的所有构造器,包括私有的 
        Constructor cons[] = clazz.getConstructors();//获取当前类的所有public的构造器(不包括访问权限以外的构造器)---相当于:在此处所能调用的那些构造器
        for(Constructor con:cons){
            System.out.println(con.toGenericString());
            System.out.println("name:"+ con.getName());//方法名
            System.out.println("DeclaringClass:"+ con.getDeclaringClass());//方法是在哪个类中声明的

            //方法的参数类型列表
            Class paramTypes[] = con.getParameterTypes();
            for(int i=0;i<paramTypes.length;i++){
                Class c = paramTypes[i];
                System.out.println("param"+i+":"+c);
            }

            //方法所抛出的异常列表
            Class exceps[]= con.getExceptionTypes();
            for(int i=0;i<exceps.length;i++){
                Class c = exceps[i];
                System.out.println("excep"+i+":"+c);
            }

            //修饰符(private static final synchronized)
            int modifier = con.getModifiers();
            System.out.println("修饰符:"+ Modifier.toString(modifier));

            System.out.println("-----------");
        }
    }

★ 获取类的属性字段

找出一个类中定义了哪些属性字段。

代码演示:

    // 获取类中所有属性(字段或变量)的信息  
    @Test
    public void demo3() throws Exception{
        Class clazz = Class.forName(clsName);
        //Field flds[] = clazz.getDeclaredFields();//获取当前类中声明的所有变量,包括私有的 
        Field flds[] = clazz.getFields();//获取当前类及其父类的所有public的变量(包括访问权限允许的所有变量)---相当于:在此处所能调用的那些变量
        for(Field fld:flds){
            System.out.println(fld.toGenericString());
            System.out.println("name:"+ fld.getName());//变量名
            System.out.println("DeclaringClass:"+ fld.getDeclaringClass());//变量是在哪个类中声明的
            System.out.println("Type:"+ fld.getType() );//变量类型

            //修饰符(private static final)
            int modifier = fld.getModifiers();
            System.out.println("修饰符:"+ Modifier.toString(modifier));

            System.out.println("-----------");
        }
    }
}

用到的类:

AA类:

class AA {
    public int a=5;
    protected double x=1;

    public void aa(int a, double b, String s) {
    }
}

UserModel类:

package cn.hncu.reflect.two;

import java.io.IOException;
import java.io.Serializable;

import cn.hncu.reflect.one.Person;
public class UserModel  extends AA implements Serializable{
    private static final long serialVersionUID = 1L;

    private String uuid;//用户id
    public static String name;//用户名
    protected int type;//用户类型
    private String pwd;

    public static final double PI=3.14;

    public UserModel(){
    }

    private UserModel(String uuid, String name, int type, String pwd) {
        this.uuid = uuid;
        this.name = name;
        this.type = type;
        this.pwd = pwd;
    }

    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    public String getName() {
        return name;
    }

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

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        UserModel other = (UserModel) obj;
        if (uuid == null) {
            if (other.uuid != null)
                return false;
        } else if (!uuid.equals(other.uuid))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return uuid + ", " + name + ", " + type;
    }

    Person aa(){
        return null;
    }
    private int bb(Person p, int n) throws NumberFormatException,IOException {
        return 0;
    }
    protected static final void cc(double d){

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值