Java反射机制常用操作

1.什么是反射?

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法。简单来说,根据指定的类名或对象倒推类的信息。

2.为什么要用反射?

往往我们面对一个新的知识时会疑惑为什么要用它,它存在的意义是什么,比其他的知识强在哪里…
首先我们需要知道两个概念:静态编译和动态编译。

  • 静态编译:在编译时确定类型,绑定对象。
  • 动态编译:运行时确定类型,绑定对象。

反射就是运用了动态编译创建对象,有很大的灵活性…

3.怎么用?

反射的核心处理在于Object的方法:

public final native Class<?> getClass();
//取得类的Class对象

class对象的三种实例化方式

1.任何类的对象可以通过调用Object类提供的getClass()方法取得该类Class对象;

Date date = new Date();//通过类正向产生对象
System.out.println(date.getClass());
//结果为class java.util.Date

2.“类名称.class”直接根据某个具体类来取得其Class对象;

Date date  = new Date();
System.out.println(date.getClass() == Date.class); //结果为true

3.调用Class类的静态方法Class.forName(String className)传入类的全名称来取得其Class对象;

Class<Date> cls = (Class<Date>) Class.forName("java.util.Date"); 
Date date = cls.newInstance(); 
System.out.println(date);//打印出当前时间

反射与类操作

  • 通过反射取得父类、父接口信息

I. 取得类的包名称

public Package getPackage();

II. 取得父类的Class对象

public native Class<? super T> getSuperClass();

*: ? >= T, ?是T的父类

III. 取得实现的父接口

public Class<?>[] getInterfaces();

*:返回值为数组,原因是接口多继承,而父类是单继承

  • 反射调用类中构造方法
    -----------------Constructor类(描述类中构造方法)

I.取得类中指定参数类型的构造

public Constructor<T> getConstructor(Class<?>... parameterTypes)

//只能取得类中public权限的构造方法


public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)

//可以取得类中全部构造方法,包含私有构造(同下II)

II.取得类中所有构造方法

public Constructor<?>[] getConstructors() throws SecurityException

public Constructor<?>[] getDeclaredConstructors() throws SecurityException

constructor类提供了实例化对象的方法:

public T newInstance(Object ... initargs):可以调用类中其他有参构造
  • 反射调用类中普通方法
    ---------------Method(描述类中普通方法)

I.取得类中指定名称的普通方法

public Method getMethod(String name,Class<?>... parameterTypes)


public Method getDeclaredMethod(String name,Class<?>... parameterTypes)

II.取得类中全部普通方法

public Method getMethods() throws SecurityException

//取得本类以及父类中所有public方法

public Method getDeclaredMethods() throws SecurityException

//取得本类中全部普通方法,包含私有方法

Method类中提供有调用类中普通方法的API

public Object invoke(Object obj,Object... args)
  • 反射调用类中属性

取得类中全部属性

public Field[] getFields() throws SecurityException
//父类中

public Field[] getDeclaredFields() throws SecuirityException

//本类中

取得类中指定名称属性

public Field getField(String name) 
        throws NosSuchFieldExcepton,SecurityException

public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
        throws NoSuchMethodException,SecurityException

设置属性:

public void set(Object obj, Object value)

取得属性:

public Object get(Object obj)

取得属性的类型:

public Class<?> getType()

后续…敬请期待…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值