Java中的反射机制

一、什么是反射机制

反射机制(Reflection)是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许对其内部的成员进行操作。反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改其本身状态或行为的一种能力。

二、反射的作用

1. 反编译:.class —>.java

2. 通过反射机制访问java对象的属性、方法、构造方法等;

三、反射机制的运用

  • 反射机制的一些包

1. Class类:代表一个类。

2. Filed类:代表类的成员变量。

3. Method类:代表类的方法。

4. Constructor类:代表类的构造方法。如图:

  • 反射中在运行阶段获取其Class对象(原生所在类)

1. 实例.getClass

2. 类名.Class

3. Class.forName("类的路径")。如图:

  • 上述三种哪种相对好一点?(当然是第三种更能体现反射本身)

  • 根据类名获取类中定义的所有属性、方法和构造方法 示例如下:

package pojo;

/**

* 狗狗类

*/

public class Dog {

//定义了三个属性

private int id; //私有的属性

int age; //默认的属性

public String name; //公有的属性

//三个方法

private void eat(){ //私有的方法

System.out.println("吃的方法");

}

void sleep(){ //默认的方法

System.out.println("小狗爱睡觉");

}

public void jiao(){ //公有的方法

System.out.println("小狗会叫");

}

}


package test;

/**

* 测试类

*/

import pojo.Dog;

import java.lang.Class;

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

public class Test {

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

Dog d = new Dog();

//第一种 通过已有对象 来反向获取Class类

Class clazz = d.getClass();

//获取方法

Method[] methods = clazz.getMethods(); //获取该类中所有的方法 包括继承来的

for (Method m : methods) {

System.out.println(m.getName()); //获取方法名

//输出结果 jiao wait wait wait equals toString hashCode getClass notify notifyAll

}

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

//获取本类自己声明的方法 包括私有 被保护的

Method[] method = clazz.getDeclaredMethods();

for (Method m : method) {

System.out.println(m.getName()); //获取方法名

//输出结果 sleep jiao eat

}

System.out.println("**************************");

//获取反射类中的成员变量(属性)

Field[] fields = clazz.getFields(); //获取所有公开的成员变量 包括继承来的

for (Field f : fields) {

System.out.println(f.getName()); //输出 name

}

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

Field[] field = clazz.getDeclaredFields(); //获取所有自己声明的成员变量

for (Field f : field) {

System.out.println(f.getName()); //输出 id age name

}

System.out.println("***************************");

//获取构造方法

Constructor[] constructors = clazz.getConstructors(); //获取所能访问到的 包括继承父类的

for (Constructor c : constructors) {

System.out.println(c.getName()); //获取方法名 输出 pojo.Dog

}

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

Constructor[] constructor = clazz.getDeclaredConstructors(); //只有自己定义的构造方法

for (Constructor c : constructor) {

System.out.println(c.getName()); //输出pojo.Dog

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值