Java重要技术(27)动态代理之查看代理对象的类型信息

1.1. 查看动态代理类的各种信息

通过反射机制可以获取Proxy创建的动态代理类的各种信息,包括实现的接口,构造函数,方法等。查看到这些信息后,可以更好的理解为什么动态代理这么使用。

/**   

* @Title: ProxyTest.java

* @Package com.test.javatechnology.proxy

* @Description:

* @author http://www.cnblogs.com/coe2coe/

* @date 2017年3月26日 下午5:36:28

* @version V1.0   

*/

package com.test.javatechnology.proxy;

import java.lang.reflect.Constructor;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Parameter;

import java.lang.reflect.Proxy;

/**

* @ClassName: ProxyTest

* @Description:

* @author http://www.cnblogs.com/coe2coe/

* @date 2017年3月26日 下午5:36:28

*  

*/

public class ProxyTest3 {

//接口

static  interface  Example{

 int  work(int a, int b);

}

//实际对象的类

static  class  SomeExample implements Example{

@Override

public int work(int a, int b) {

System.out.println("SomeExample.work() called.");

return a+b;

}

}

//用于代理类创建代理对象实例的Handler。

public static void main(String[] args) {

try {

//实际对象。

final SomeExample realObject = new SomeExample();

//使用newProxyInstance()方法创建代理类的对象实例

Example  example = (Example)Proxy.newProxyInstance(

SomeExample.class.getClassLoader(),//类加载器。

SomeExample.class.getInterfaces(), //实现的接口。

new InvocationHandler(){//Handler

//在调用代理对象实例的方法时会执行此函数。

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

System.out.println("invoke before:" + method.getName() );

//转发到实际对象。

Object result = method.invoke(realObject, args);

System.out.println("invoke after:" + method.getName() );

return result;

}

}

);

//获取代理类的Class信息。

Class  clazz = example.getClass();

//获取代理类实现的接口。

System.out.println("interfaces:");

for(Class i: clazz.getInterfaces()){

System.out.println(i.getTypeName());

}

//获取代理类的构造函数

System.out.println("constructos:");

for(Constructor c: clazz.getConstructors()){

System.out.print(c.getName() + "(" );

boolean first=true;

for(Parameter  p: c.getParameters()){

if(!first){

System.out.print(" , ");

}

else{

first=false;

}

System.out.print(p.getType().getTypeName() + " " + p.getName());

}

System.out.println(")");

}

//获取代理类的方法。

System.out.println("methods:");

for(Method m: clazz.getMethods()){

System.out.print(m.getName() + "(" );

boolean first=true;

for(Parameter  p: m.getParameters()){

if(!first){

System.out.print(" , ");

}

else{

first=false;

}

System.out.print(p.getType().getTypeName() + " " + p.getName());

}

System.out.println(")");

}

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (SecurityException e) {

e.printStackTrace();

}

}

}

运行结果:

interfaces:

com.test.javatechnology.proxy.ProxyTest3$Example

constructos:

com.test.javatechnology.proxy.$Proxy0(java.lang.reflect.InvocationHandler arg0)

methods:

equals(java.lang.Object arg0)

toString()

hashCode()

work(int arg0 , int arg1)

isProxyClass(java.lang.Class arg0)

newProxyInstance(java.lang.ClassLoader arg0 , java.lang.Class[] arg1 , java.lang.reflect.InvocationHandler arg2)

getInvocationHandler(java.lang.Object arg0)

getProxyClass(java.lang.ClassLoader arg0 , java.lang.Class[] arg1)

wait()

wait(long arg0 , int arg1)

wait(long arg0)

getClass()

notify()

notifyAll()

时间: 2024-12-27 20:32:27

Java重要技术(27)动态代理之查看代理对象的类型信息的相关文章

基于JAVA WEB技术旅游服务网站系统设计与实现网上程序代写

基于JAVA WEB技术旅游服务网站系统设计与实现网上程序代写 专业程序代写服务(QQ:928900200) 随着社会的进步.服务行业的服务水平不断发展与提高,宾馆.酒店.旅游等服务行业的信息量和工作量日益变大,而传统的人工管理方式已经远远不能满足现在旅游的服务方式.传统的旅游方式经分析其有诸多的缺陷,存在数据维护效率低下,不易保管,容易丢失和出错.同时查询也不方便,劳动力成本过高导致的旅游资源信息不方便,也在一定程度上导致了对各种信息反应缓慢,容易丧失商机.为了弥补上述缺陷,便于开展旅游预订工

java 反射技术

什么是反射?反射就是将字节码中的各种成分映射到相应的java类中来,java反射技术自JDK1.1以来就出现了,目前大多数流行的框架都采用了这种技术,可见其重要性,这篇文章将详细介绍我对java反射技术的一些研究. 代表字节码对象的Class java中所有的类都有自己特有的一份字节码,当程序调用该类时,JVM便会将这份字节码装载到内存中来.在java中主要有三种方法来得到相应的字节码对象. 通过类的实例的getClass()方法获取,如 Class clazz=new Date().getCl

深入理解Java类型信息(Class对象)与反射机制

深入理解Class对象 RRTI的概念以及Class对象作用 认识Class对象之前,先来了解一个概念,RTTI(Run-Time Type Identification)运行时类型识别,对于这个词一直是 C++ 中的概念,至于Java中出现RRTI的说法则是源于<Thinking in Java>一书,其作用是在运行时识别一个对象的类型和类的信息,这里分两种:传统的"RRTI",它假定我们在编译期已知道了所有类型(在没有反射机制创建和使用类对象时,一般都是编译期已确定其类

深入理解Java类型信息(Class对象)与反射机制(干货)

[版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/70768369 出自[zejian的博客] 本篇主要是深入对Java中的Class对象进行分析,这对后续深入理解反射技术非常重要,这篇有点偏向内功类文章,主要内容如下: 深入理解Class对象 RRTI的概念以及Class对象作用 Class对象的加载及其获取方式 Class对象的加载 ClassforName方法 Class字面常

Java基础 -- 深入理解Java类型信息(Class对象)与反射机制

一 RTTI概念 认识Claa对象之前,先来了解一个概念,RTTI(Run-Time Type Identification)运行时类型识别,对于这个词一直是 C++ 中的概念,至于Java中出现RTTI的说法则是源于<Thinking in Java>一书,其作用是在运行时识别一个对象的类型和类的信息,这里分两种: 传统的”RTTI”:它假定我们在编译期已知道了所有类型(在没有反射机制创建和使用类对象时,一般都是编译期已确定其类型,如new对象时该类必须已定义好): 反射机制,它允许我们在运

使用sos查看.NET对象内存布局

前面我们图解了.NET里各种对象的内存布局,我们再来从调试器和clr源码的角度来看一下对象的内存布局.我写了一个测试程序来加深对.net对象内存布局的了解: using System; using System.Runtime.InteropServices; // 实际上是一个C语言里的联合体 [StructLayout(LayoutKind.Explicit)] public struct InnerStruct { [FieldOffset(0)] public float FloatVa

Java如何在运行时识别类型信息?

在日常的学习工作当中,有一些知识是我们在读书的时候就能够习得:但有一些知识不是的,需要在实践的时候才能得到真知--这或许就是王阳明提倡的"知行合一". 在Java中,并不是所有的类型信息都能在编译阶段明确,有一些类型信息需要在运行时才能确定,这种机制被称为RTTI,英文全称为Run-Time Type Identification,即运行时类型识别,有没有一点"知行合一"的味道?运行时类型识别主要由Class类实现. 一.Class类 在Java中,我们常用&quo

代理模式 &amp; Java原生动态代理技术 &amp; CGLib动态代理技术

第一部分.代理模式  代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务.(其实就是在代理类中关联一个委托类的实例,然后在代理类中进行包装). UML图如下: 第二部分.在Java中实现代理模式  按照代理的创建时期,代理类可以分

Java核心技术点之动态代理

本篇博文会从代理的概念出发,介绍Java中动态代理技术的使用,并进一步探索它的实现原理.由于个人水平有限,叙述中难免出现不清晰或是不准确的地方,希望大家可以指正,谢谢大家:) 一.概述 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道背后的厂家究竟是谁,也就是说,“委托者”对我们来说是不可见的:其次,微商代理主要以朋友圈的人为目标客户,这就相当于为厂家做了一次对客户群体的“过滤”.我们把微商代理