Java反射技术
反射概念
Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。
反射应用场景
- 几乎所有的框架都会用到反射
- 程序解耦合使用
- 代码更加的优雅
反射更多细节
-
Jdk中的位置: java.lang.reflect包下
-
获取字节码方式
// 通过类的全限定类名获取 Class<?> clazzA = Class.forName("com.open_source.demo.domain.Hero"); // 通过类直接获取 Class<Hero> clazzB = Hero.class; // 通过实例化对象获取 Class<? extends Hero> clazzC = (new Hero()).getClass(); // 基本类型的包装类的type获取 Class<Byte> byteClazz = Byte.TYPE; Class<Short> typeClazz = Short.TYPE; Class<Integer> integerClazz = Integer.TYPE; Class<Long> longClazz = Long.TYPE; Class<Float> floatClazz = Float.TYPE; Class<Double> doubleClazz = Double.TYPE; Class<Character> characterClazz = Character.TYPE; Class<Boolean> booleanClazz = Boolean.TYPE;
-
测试类Hero省略Setter和Getter以及toString方法其中包含无参构造和满参构造
package com.open_source.demo.domain; /** * 英雄实体类 * * @author: tyvek */ public class Hero { /** * 类型 */ private String type; /** * 姓名 */ private String name; /** * 战力 */ private Double CE; /** * 打印英雄属性 * * @param hero 英雄对象 */ public void attrbute(Hero hero) { System.out.println(hero.getType() + ": " + hero.getName() + "输出伤害: " + hero.getCE()); } /** * 为队友加油 */ public void fighting() { System.out.println("稳住 我们能赢"); } /** * 向英雄发起进攻 * * @param name 英雄名字 */ public void attack(String name) { System.out.println("准备向" + name + "发起进攻"); } public Hero(String type, String name, Double CE) { this.type = type; this.name = name; this.CE = CE; } public Hero() { } }
-
获取类的成员
-
获取类的构造函数
import java.util.StringJoiner; /** * 反射测试类 * @author: tyvek */ public class ReflectClient { public static void main(String[] args) throws ClassNotFoundException { // 通过类的全限定类名获取 Class<?> clazzA = Class.forName("com.open_source.demo.domain.Hero"); // 获取所有构造函数字节码 Constructor<?
-