java 反射提取类信息, 动态代理 和过滤某些方法演示

package org.rui.classts.reflects;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.regex.Pattern;

/**
 * 提取 类的  方法 构造器
 * @author lenovo
 *
 */
//{args:ShowMethods}
//查看一个类的所有方法和构造器
public class ShowMethods {
	private static String usage="usage:showMethod qualified.class.mane";

	private static Pattern p=Pattern.compile("\\w+\\.");

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

		//System.out.println(args[0]+"  :  "+args[1]);
		args=new String[1];
		args[0]="org.rui.classts.reflects.ShowMethods";
		//args[1]="java.awt.Color";

		if(args.length<1)
		{
			System.out.println(usage);
		    System.exit(0);
		}
		int lines=0;
		Class<?> c=Class.forName(args[0]);
		Method[] m=c.getMethods();
		Constructor[] constructor=c.getConstructors();
		if(args.length==1)
		{
			for(Method mt:m)
			{
				//System.out.println("tostring:"+mt.toString());
				//去掉带 点和前面的字符 如  xx.ss.
				System.out.println("m1:"+
				p.matcher(mt.toString()).replaceAll("")
						);
			}
			//----------------------------------------
			for(Constructor con:constructor)
				System.out.println("c1:"+
						p.matcher(con.toString()).replaceAll("")
						);
			lines=m.length+constructor.length;
		}
		else
		{
			for(Method mt:m)
			{
				if(mt.toString().indexOf(args[1])!=-1)
				{
					System.out.println("m2:"+
							p.matcher(mt.toString()).replaceAll("")
									);
					lines++;
				}

			}
			//----------------------------------------
			for(Constructor con:constructor)
			{
				if(con.toString().indexOf(args[1])!=-1)
				{
					System.out.println("c2:"+
							p.matcher(con.toString()).replaceAll("")
							);
				lines++;
				}

			}
		}

	}

}
package org.rui.classts.reflects;

/**
 * 简单动态代理 实现
 * @author lenovo
 *
 */
interface Interface
{
	 void doSomething();
	void somethingElse(String arg);
}
//class------------------
class RealObject implements Interface{
	public void doSomething() {
		System.out.println("RealObject doSomething");
	}

	public void somethingElse(String arg) {
		System.out.println("RealObject somethingElse:"+arg);
	}
}
//class-SimpleProxy-----------------
class SimpleProxy implements Interface{
	 private Interface proxied;

	 public SimpleProxy(Interface proxied){this.proxied=proxied;}

	    //method
		public void doSomething() {
			System.out.println("SimpleProxy doSomething");
			proxied.doSomething();
		}

		public void somethingElse(String arg) {
			System.out.println("SimpleProxy somethingElse:"+arg);
			proxied.somethingElse(arg);
		}
	 }

public class SimpleProxyDemo {

	public static void consumer(Interface inta)
	{
		inta.doSomething();
		inta.somethingElse("bonobo");
	}

     //main----------
	public static void main(String[] args)
	{
		//Interface o=new RealObject();
		//真实对象去实现
		consumer(new RealObject());
		//代理去实现
		consumer(new SimpleProxy(new RealObject()));

	}

}
package org.rui.classts.reflects;

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

//DynamicProxyHandler
class DynamicProxyHandler  implements InvocationHandler{

	private Object proxied;

	public DynamicProxyHandler(Object proxied)
	{
		this.proxied=proxied;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("proxy:=="+proxy.getClass()
				+"\nmethod:=="+method
				+" \nargs:"+args);

		if(args!=null)
			for(Object o:args)
				System.out.println("arg:"+o);
		//把 实际对象给  proxied
		return method.invoke(proxied, args);

	}
}

class SimpleDynamicProxy{
	public static void consumer(Interface iface)
	{
		iface.doSomething();
		iface.somethingElse("bonobo==");
	}

	public static void main(String[] args) {
		RealObject robj=new RealObject();
		consumer(robj);

		//代理
		//返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
		Interface proxy=(Interface) Proxy.newProxyInstance(
				Interface.class.getClassLoader(), // 定义代理类的类加载器
				new Class[]{Interface.class},// 代理类要实现的接口列表
				new DynamicProxyHandler(robj)//指派方法调用的调用处理程序
				);
		consumer(proxy);

	}
}
package org.rui.classts.reflects;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
 * 动态代理过滤某些方法 的演示
 * @author lenovo
 *
 */

	class MethodSelector implements InvocationHandler
	{
		private Object obj;
		public MethodSelector(Object o){this.obj=o;}
		public Object invoke(Object proxy, Method method, Object[] args)
				throws Throwable
		{
			//System.out.println("proxy:"+proxy.getClass().getSimpleName());
			//可以拦截特殊处理
			if(method.getName().equals("interesting"))
			{
				System.out.println("proxy detected the interesting method");
			}
		 return method.invoke(obj, args);
		}
	 }

	// interface
	interface SomeMethod
	{
		void boring1();
		void interesting(String arg);
		void boring2();
		void boring3();
	}
	//------------------------------
	class Implementation implements SomeMethod
	{
		public void boring1()
		{
			System.out.println("boring1");
		}
		public void interesting(String arg)
		{
			System.out.println("interesting:"+arg);
		}
		public void boring2()
		{
			System.out.println("boring2");
		}

		public void boring3()
		{
			System.out.println("boring3");

		}

	}

//
public class SelectingMethods {
	public static void main(String[] args)
	{
		//代理测试
		SomeMethod proxy =(SomeMethod)Proxy.newProxyInstance(
				SomeMethod.class.getClassLoader(), // 定义代理类的类加载器
				new Class[]{SomeMethod.class},// 代理类要实现的接口列表
				new MethodSelector(new Implementation())//指派方法调用的调用处理程序
				);

		proxy.boring1();
		proxy.boring2();
		proxy.interesting("bonobo");
		proxy.boring3();

	}

}

对比测试

package org.rui.classts;

import org.rui.classts.chilnd.*;

public class PetCount4 {

	public static void main(String[] args) {
		Pet p=new Dog();
		Class c=Pet.class;
		Class c1=Dog.class;
		Class c2=Cat.class;
		//对象对比 类
		if(p instanceof Dog){
			System.out.println("true");
		}else	System.out.println("fales");

		//class 对比 对象
		if(c.isInstance(p)){
			System.out.println("true");
		}else	System.out.println("fales");
		// class对比class
		if(c.isAssignableFrom(c1)){
			System.out.println("true");
		}else	System.out.println("fales");

		if(c2.isAssignableFrom(c1)){
			System.out.println("true");
		}else	System.out.println("fales");

		System.out.println("c==c1:"+(c==c1));
		System.out.println("c.equals(c1:"+(c.equals(c1)));

		System.out.println("c==Pet.class:"+(c==Pet.class));
		System.out.println("c.equals(Pet.class:"+(c.equals(Pet.class)));

	}

}

java 反射提取类信息, 动态代理 和过滤某些方法演示,布布扣,bubuko.com

时间: 2024-10-13 10:08:24

java 反射提取类信息, 动态代理 和过滤某些方法演示的相关文章

java反射机制中的动态代理

java反射机制中的动态代理 动态代理模式及其使用 步骤1:定义一个接口 //接口 interface Subject{ void action(); } 步骤2:定义一个接口的实现类,也就是被代理类 //被代理类 class RealSubject implements Subject { @Override public void action() { System.out.println("我是被代理类,请执行我"); } } 步骤3:定义一个实现InvocationHandle

java反射机制应用之动态代理

1.静态代理类和动态代理类区别 静态代理:要求被代理类和代理类同时实现相应的一套接口:通过代理类的对象调用重写接口的方法时,实际上执行的是被代理类的同样的 方法的调用. 动态代理:在程序运行时,根据被代理类及其实现的接口,动态的创建一个代理类.当调用代理类的实现的抽象方法时,就发起对被代理类同样方法的调用. 涉及到的技术点: ①提供一个实现了InvocationHandler接口实现类,并重写其invoke()方法 ②Proxy.newProxyInstance(obj.getClass().g

java 反射之静态and动态代理

首先说一下我们什么情况下使用代理? (1)设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,我们在工作中有时会接手很多前人的代码,里面代码逻辑让人摸不着头脑(sometimes the code is really like shit),这时就很难去下手修改代码,那么这时我们就可以通过代理对类进行增强. (2)我们在使用RPC框架的时候,框架本身并不能提前知道各个业务方要调用哪些接口的哪些方法 .那么这个时候,就可用通过动态代理的方式来建立一个中间人给客户端使用,也方便框架进行搭建逻

Java语言中反射动态代理接口的解释与演示

Java语言中反射动态代理接口的解释与演示 Java在JDK1.3的时候引入了动态代理机制.可以运用在框架编程与平台编程时候捕获事件.审核数据.日志等功能实现,首先看一下设计模式的UML图解: 当你调用一个接口API时候,实际实现类继承该接口,调用时候经过proxy实现. 在Java中动态代理实现的两个关键接口类与class类分别如下: java.lang.reflect.Proxy java.lang.reflect.InvocationHandler 我们下面就通过InvocationHan

[Java]Spring AOP基础知识-动态代理

Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Java知识进行学习.Spring AOP使用了两种代理机制:一种是基于JDK的动态代理:另一种是基于CGLib的动态代理.之所以需要两种代理机制,很大程度上是因为JDK本身只提供接口的代理,而不支持类的代理. 带有横切逻辑的实例 我们通过具体化代码实现上一节所介绍例子的性能监视横切逻辑,并通过动态代理技术对此进行改造.在调用每一个目标类方法时启动方法的性能监视,在目标类方法调

Java学习之:JDK动态代理与CGLIB动态代理

代理的概念:简单的理解就是通过为某一个对象创建一个代理对象,我们不直接引用原本的对象,而是由创建的代理对象来控制对原对象的引用. 动态代理:是指在程序运行时由Java反射机制动态生成,无需手动编写代码.动态代理不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java反射机制可以生成任意类型的动态代理类. 代理原理:代理对象内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象.同时,代理对象可以在执行真实对象操作时,附加其他的操作

java开发必学知识:动态代理

目录 1. 引言 2. 代理模式及静态代理 2.1 代理模式说明 2.2 静态代理 2.3 静态代理局限性 3. 动态代理 3.1 JAVA反射机制 3.2 JDK动态代理 3.2.1 JDK动态代理 3.2.2 JDK动态代理与限制 3.4 CGLIB动态代理 4. 动态代理在Spring的应用:AOP 4.1 AOP 概念 4.2 AOP编程 4.2.1 引入aop依赖 4.2.2 定义切面.切点与通知 5. 总结 参考资料 往期文章 一句话概括:java动态代理通过反射机制,可在不修改原代

通过反射查看类信息

通过反射查看类信息 1.获得Class对象的三个方式 (1)使用Class类的forName(String clazzName)静态方法.该方法需要传入字符串参数,该字符串参数的值是某个类的全限定名(必须添加完整的包名): //例如在JDBC中加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); (2)调用某个类的class属性来获取该类对应的Class对象: //假设现有Student类 //调用该类的class属性获取Class对象 Cla

Java远程过程调用基础:构建可自适应的动态代理对象的通用方法

[toc] Java远程过程调用基础:构建可自适应的动态代理对象的通用方法 前言 关于动态代理的知识,这里不再过多说明.这里要介绍的是,如何创建一个可自适应任意接口的动态代理对象的通用方法,也就是说,引用对象可为任意接口,举个例子,假如返回动态代理对象的方法是getProxy,而同时存在两个接口UserInterface和ProductInterface,这时可以这样使用: UserInterface user = getProxy(UserInterface.class); ProductIn