java反射机制(一,引入和基本介绍)

1.java反射机制解释
最近做了一个项目,数据的层与层之间的传输,是断层的,是通过反射和继承来传输数据,来回实现的。
目的:
增加程序的灵活性。
如struts中。请求的派发控制。
当请求来到时。struts通过查询配置文件。找到该请求对应的action。已经方法。
然后通过反射实例化action。并调用响应method。
如果不适用反射,那么你就只能写死到代码里了。
所以说,一个灵活,一个不灵活。
很少情况下是非用反射不可的。大多数情况下反射是为了提高程序的灵活性。
因此一般框架中使用较多。因为框架要适用更多的情况。对灵活性要求较高。
反射很多地方在用,代码编辑器智能提示就是反射的例子。网页输入提示也是反射的例子。

JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
只要是Reflection APIs,涉及到谈到java.lang.Class,以及java.lang.reflect中的Method、Field、Constructor等等classes。

首先了解java.lang.Class:Java有个Object 类,是所有Java 类的继承根源。
getClass()返回一个Class 对象:当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class 对象。Class是Reflection故事起源。针对任何您想探勘的类,唯有先为它产生一个Class 对象,接下来才能经由后者唤起为数十多个的Reflection APIs。
Java允许我们从多种管道为一个class生成对应的Class object

2.Java Reflection API简介

在JDK中,主要由以下类实现Java反射机制:

①Class类:代表一个类;

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

③Method类:代表类的方法;

④Constructor类:代表类的构造方法;

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

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

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

Class类是Reflection API中的核心类,主要有以下方法:

①getName():获取类的名字;

②getFields():获取类中public类型的属性;

③getDeclaredFields():获取类的所有属性(包括public、protected、default、private);

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

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

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

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

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

⑨newInstance():通过类默认的不带参数的构造方法创建该类的一个对象;

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

过了很久现在回来填利用反射实现动态代理的坑。
程序举例:
接口:

public class myInterface {
	public void print();
}

实现类:

public class myInterfaceImpl implements myInterface {
		@Override
		public void print() {
			System.out.println("okk");
	}
}

代理类 + 实现

package com.auto.demo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class MyTest implements InvocationHandler {

Object Object = null;

public MyTest(Object Object) {this.Object = Object;}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("before");
    Object = method.invoke(Object, args);
    System.out.println("after");
    return Object;
}

public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
    
    Class<?> clazz = Class.forName("com.auto.demo.myInterfaceImpl");
    MyTest handler = new MyTest(clazz.newInstance());
  myInterface  mi = (myInterface )Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(),  handler);
    mi.print();
}
}

由上总结动态代理的两种实现方式:
1,JDK动态代理实现。
实现步骤: 接口-> 实现类 -> 代理类(1,实现InvocationHandler。2,构造方法对象构造。3重写方法调用构造的对象invoke)-> 动态代理调用(1,通过反射拿到需要被实现的实现类。2,使用Proxy得到接口,通过接口调用(这一步不能忘))
2,Cglib增强动态代理实现。(差不多就不给樗例子了,并且它是不需要接口的支持的)
实现步骤:接口-> 实现类-> 代理类(1,实现MethodInterceptor过滤。2,methodProxy.invokeSuper(o,objects)调用对象)-> 动态代理增强调用(1,实现Enhancer,并设置setSuperclass(接口类),setCallback(你得代理类)。2,增强创建create,得到接口实现.3, 实现调用方法。)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值