day-3-2-4

反射

反射的作用

Java反射机制允许程序在运行时透过Reflection APIs取得任意一个已知名称的class的内部信息,包括
modifiers(如public、static等)、superclass(如Object)、实现的interfaces(如Serializable)、fields(属性)和methods(方法)(但不包括methods定义),可于运行时改变fields的内容,也可调用methods

优点:

在运行时获得类的各种内容,进行反编译,对于Java这种先编译再运行的语言,能够很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象。

缺点:

  • 反射会消耗一定的系统资源,因此,如果不需要动态地创建一个对象,那么就不需要用反射
  • 反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题
反射的用途
  • 反编译:.class-->.java
  • 通过反射机制访问java对象的属性,方法,构造方法等
  • 当在使用IDE,比如Ecplise时,当输入一个对象或者类,并想调用他的属性和方法是,一按点号,编译器就
    会自动列出他的属性或者方法,这里就是用到反射。
  • 反射最重要的用途就是开发各种通用框架。比如很多框架Spring都是配置化的(比如通过XML文件配置Bean),为了保证框架的通用性,可能需要根据配置文件加载不同的类或者对象,调用不同的方法,这个时候就必须使用到反射了,运行时动态加载需要的加载的对象
    MyBatis持久层框架 Spring业务层框架 SpringMVC表现层框架
在JDK中,主要由以下类实现Java反射机制:
  • Class类:代表一个类

  • Field类:代表类的成员变量(属性)

  • Method类:代表类的方法

  • Constructor类:代表类的构造方法

  • Array类:提供了动态创建数组,以及访问数组元素的静态方法;

以上类中,Class类在java.lang包,其余位于java.lang.reflect包。

java.lang.Object类(所有类的超类)定义了getClass()方法,任意一个Java对象都可以通过此方法获
得它的class。

Class类是Reflection API中的核心类,主要有以下方法:
  • getName():获取类的名字,例如java.util.Date

  • getFields():获取类中public类型的属性,自定义或者从父类种继承

  • getDeclaredFields():获取类的所有属性(包括public、protected、default、private),只能获取到当前类种定义,不能获取父类继承的

  • getMethods():获取类中public类型的方法

  • getDeclaredMethods():获取类的所有方法

  • getMethod(String name,Class[] parameterTypes):获取类的指定方法,name:指定方法的名字,parameterType:指定方法的参数类型

  • getDeclaredMethod

  • getConstrutors():获取类中public类型的构造方法

  • getDeclaredConstructors()

  • getConstrutor(Class[] parameterTypes):获取类的指定构造方法,parameterTypes:指定构造方法的参数类型

  • getDeclaredConstructor

  • newInstance():通过类的public不带参数的构造方法创建该类的一个对象;@Deprecated(since=“9”)

注:在访问私有属性和私有方法时,需要对访问的私有属性或方法设置setAccessible(true)使被反射的类抑制java的访问检查机制。否则会报IllegalAccessException异常。

获取构造方法

通过反射机制得到某个类的构造器,然后调用该构造器创建该类的一个实例。Class<T>类提供了几个方法获取类的构造器。

获取类属性

获取类的Fields。可以通过反射机制得到某个类的某个属性,然后改变对应于这个类的某个实例的该属性值。JAVA 的Class<T>类提供了几个方法获取类的属性。

获取类中的方法

通过反射机制得到某个类的某个方法,然后调用对应于这个类的某个实例的该方法。Class类提供了几个方法获取类的方法。

package demo3;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test {
	public static void main(String[] args) {
		Class clz = A1.class; // 获取用于指代A1类的对象

		// 获取属性
		Field[] fs = clz.getDeclaredFields(); // 获取当前类种所有的声明的属性
		for (Field tmp : fs)
			System.out.println(tmp);
			// private java.lang.Long demo3.A1.id 
			// private java.lang.String demo3.A1.name

		// 获取方法
		Method[] ms = clz.getDeclaredMethods();// 获取当前类种的所声明的所有方法
		for (Method tmp : ms)
			System.out.println(tmp);
			// public void demo3.A1.pp()
        
		// 获取构造器
		Constructor[] cs = clz.getConstructors();// 获取当前类种所有的构造器
		for (Constructor tmp : cs)
			System.out.println(tmp);
        	// public demo3.A1()
			// public demo3.A1(int)

	}
}

class A1 {
	private Long id;
	private String name;

	public A1() {
	}

	public A1(int kk) {
	}

	public void pp() {
		System.out.println("A1种的pp方法");
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值