反射(一) Reflection - 获取类的属性&方法

语法

// 加载类到内存中
Class<?> clazz = Class.forName("com.duoduo.User");

加载类完成之后,在堆内存中,就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象包含了类的所有信息,我们可以通过这个对象看到类的所有结构。

反射:这个对象就像一面镜子,透过这个镜子可以看到类的结构。

实体类

package com.duoduo;

import com.annotation.Column;
import com.annotation.Table;

/**
 * @author Duoduo
 * @version 1.0
 * @date 2017/5/13 10:33
 */

@Table(name = "User")
public class User {

    @Column(name = "userName")
    private String userName;

    private String password;
    public int age;

    public User() {
    }

    public User(String userName) {
        this.userName = userName;
    }


    public User(String userName, String password, int age) {
        this.userName = userName;
        this.password = password;
        this.age = age;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                '}';
    }
}

反射测试类

package com.duoduo.reflection;

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

/**
 * @author Duoduo
 * @version 1.0
 * @date 2017/5/14 22:53
 */
public class Demo1 {
    public static void main(String[] args){

        try {
            // 加载类到内存中
            Class<?> clazz = Class.forName("com.duoduo.User");

            //获取报名+类名
            System.out.println(clazz.getName());
            //获取类名
            System.out.println(clazz.getSimpleName());

            //获取public属性
            Field[] publicFileds = clazz.getFields();
            System.out.println(publicFileds.length);
            for (Field field: publicFileds){
                System.out.println(field.getName());
            }

            System.out.println("********* 获取所有的属性字段 **************");
            Field[] fields = clazz.getDeclaredFields();
            for (Field field:fields){
                System.out.println("----------------------------");
                System.out.println("属性 : "+field);

                Annotation[] annotations =  field.getAnnotations();
                for ( Annotation annotation:annotations){
                    System.out.println("注解 : "+ annotation.toString());
                }
            }

            System.out.println("********* 获取所有的方法 **************");
            Method[] methods = clazz.getDeclaredMethods();
            for (Method method: methods){
                System.out.println(method);
            }

            //如果方法有参数,则必须传递参数对应的class对象
            Method setMethod = clazz.getDeclaredMethod("setPassword", String.class);
            System.out.println(setMethod);

            System.out.println("********* 获取所有的构造器 **************");
            Constructor[] constructors = clazz.getDeclaredConstructors();
            for (Constructor constructor:constructors){
                System.out.println(constructor);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

测试结果

********* 获取报名+类名 **************
com.duoduo.User
类名 : User
********* 获取public属性 **************
age
********* 获取所有的属性字段 **************
----------------------------
属性 : private java.lang.String com.duoduo.User.userName
注解 : @com.annotation.Column(name=userName)
----------------------------
属性 : private java.lang.String com.duoduo.User.password
----------------------------
属性 : public int com.duoduo.User.age
********* 获取所有的方法 **************
public java.lang.String com.duoduo.User.toString()
public void com.duoduo.User.setAge(int)
public void com.duoduo.User.setUserName(java.lang.String)
public int com.duoduo.User.getAge()
public void com.duoduo.User.setPassword(java.lang.String)
public java.lang.String com.duoduo.User.getUserName()
public java.lang.String com.duoduo.User.getPassword()
public void com.duoduo.User.setPassword(java.lang.String)
********* 获取所有的构造器 **************
public com.duoduo.User(java.lang.String,java.lang.String,int)
public com.duoduo.User(java.lang.String)
public com.duoduo.User()

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值