java反射

反射

  • 将类的各个组成部分封装为其他对象,反射机制

获取Class对象的方式

  • Class.forName(“全路径”); 将字节码文件加载进内存,返回class对象
  • 类名.class; 通过类名的属性class获取
  • 对象.getClass(); 该方法定义于Object类中
Book类
package com.study.domain;

public class Book {

    public String a;
    protected String b;
    String c;
    private String name;
    private String number;


    public Book(String name, String number) {
        this.name = name;
        this.number = number;
    }

    public Book() {
    }

    public String getName() {
        return name;
    }

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

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }
}


测试类
package com.study.Reflect;

import com.study.domain.Book;

public class Reflect {
    public static void main(String[] args) throws Exception{
        Class cla1 = Class.forName("com.study.domain.Book");
        System.out.println(cla1);
        Class<Book> cla2 = Book.class;
        System.out.println(cla2);
        Book book = new Book();
        Class cla3 = book.getClass();
        System.out.println(cla3);
        System.out.println(cla1 == cla2);
        System.out.println(cla1 == cla3);
    }
}
运行结果
class com.study.domain.Book
class com.study.domain.Book
class com.study.domain.Book
true
true

Class对象功能

获取成员变量
  • Field[] fields = cla1.getFields(); 获取public修饰的所有成员变量
  • Field a = cla1.getField("a"); 获取指定名字的成员变量(public修饰的)
  • Field[] declaredFields = cla1.getDeclaredFields(); 获取所有的成员变量
  • Field a1 = cla1.getDeclaredField("a"); 指定名字的 所有的成员变量都可以访问
测试方法
    Class cla1 = Class.forName("com.study.domain.Book");
    Field[] fields = cla1.getFields();
    Field a = cla1.getField("a");
    Field[] declaredFields = cla1.getDeclaredFields();
    Field a1 = cla1.getDeclaredField("b");
    System.out.println(a1);
    //设置private修饰的成员变量可修改
    a1.setAccessible(true);
    for (Field declaredField : declaredFields) {
        System.out.println(declaredField);
    }
    for (Field field : fields) {
        System.out.println(field);
    }
    System.out.println(a);

打印结果为

    protected java.lang.String com.study.domain.Book.b
    public java.lang.String com.study.domain.Book.a
    protected java.lang.String com.study.domain.Book.b
    java.lang.String com.study.domain.Book.c
    private java.lang.String com.study.domain.Book.name
    private java.lang.String com.study.domain.Book.number
    public java.lang.String com.study.domain.Book.a
    public java.lang.String com.study.domain.Book.a
获取构造器
  • 同Field 四种获取方式
测试类
        Class cla1 = Class.forName("com.study.domain.Book");
        Constructor constructor = cla1.getConstructor(String.class,String.class);
        System.out.println(constructor);

打印

public com.study.domain.Book(java.lang.String,java.lang.String)
获取对象
  • 同上 四种获取方式
        Class cla1 = Class.forName("com.study.domain.Book");
        Method[] methods = cla1.getMethods();
        Book book = new Book();
        //执行该方法
        getName.invoke(book);
        Method getName = cla1.getMethod("getName");
        System.out.println(getName);
        for (Method method : methods) {
            System.out.println(method);
        }

打印结果 同时打印了Object类中的方法

public java.lang.String com.study.domain.Book.getName()
public java.lang.String com.study.domain.Book.getNumber()
public java.lang.String com.study.domain.Book.getName()
public void com.study.domain.Book.setName(java.lang.String)
public void com.study.domain.Book.setNumber(java.lang.String)
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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值