java高级反射(全网最详细)

概述

JAVA反射机制:
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
反射(Reflection)被视为动态语言的关键,
反射是框架的灵魂。

反射的优点

1 可以在程序运行过程中,操作这些对象
2 可以解耦,提高程序可扩展性

反射获取字节码class对象的方式

// 实例代码
package reflectionday01;

public class Person {
private String name;
private Integer age;

public String getName() {
    return name;
}

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

public Integer getAge() {
    return age;
}

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


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

public Person() {

}

}

1.Class.forName(“类全名”);将字节码文件加载进内存,返回class对象;

多用于配置文件,将类名将类名定义在配置文件中,读取文件,加载类.

public static void main(String[] args) throws ClassNotFoundException {

    // Class.forName("类全名");将字节码文件加载进内存,返回class对象;
    Class cls = Class.forName("reflectionday01.Person");

    System.out.println(cls);
}
2 类名.class;通过类名的属性class获取

多用于参数的传递

public static void main(String[] args) throws ClassNotFoundException {


    // 类名.class;通过类名的属性class获取
    Class<Person> personClass = Person.class;
    System.out.println(personClass);


}
3 对象.getclass();getclass()方法在object类中定义着;

多用于对象获取字节码 方式

public static void main(String[] args) throws ClassNotFoundException {
//对象.getclass();getclass()方法在object类中定义着;
Person person =new Person();
Class cls = person.getClass();
System.out.println(cls);
}

总结
同一个字节码文件(.class)再一次程序运行中,只会被加载一次,不论通过哪种方式获取的class 对象都是同一个。

class 对象功能

获取功能:

1.获取成员变量们

Field[] getFields(); //获取所有的 public 修饰的成员变量
Field getField(String name)
Field[] declaredFields = personClass.getDeclaredFields(); //获取所有的成员

Field name = personClass.getDeclaredField(“name”);

     // 暴力反射  获取私有 成员变量
    name.setAccessible(true);
    Object o = name.get(p);
    System.out.println(o);
    name.set(p,"zhangsan");
    System.out.println(p.getName());
Field:成员变量操作

1 设置值
set(object obj.object value)
2 获取值
get(object o);
3 忽略访问权限修饰符的安全检查 暴力反射
setAccessible(boolean flag): true 忽略

2 获取构造方法们

1 Constructor getConstructor(Class<?>… parameterTypes)

Constructor constructor = personClass.getConstructor(String.class, Integer.class);
//创建对象
Object peo = constructor.newInstance(“张三”, 19);

 System.out.println(peo);
Constructor:构造方法

1 创建对象
newInstance(Object … initargs)

2 如果使用空参构造方法 可以直接使用 class 的 newInstance 方法

3 忽略访问权限修饰符的安全检查 暴力反射
setAccessible(boolean flag): true 忽略

3 获取成员方法们

Method[] methods = clsq.getMethods();
Method method = clsq.getMethod(String name, Class<?>… parameterTypes)

4 获取类名

String getName();

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值