java 反射提取类信息, 动态代理 和过滤某些方法演示
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 反射提取类信息, 动态代理 和过滤某些方法演示的更多相关文章
- java反射机制应用之动态代理
1.静态代理类和动态代理类区别 静态代理:要求被代理类和代理类同时实现相应的一套接口:通过代理类的对象调用重写接口的方法时,实际上执行的是被代理类的同样的 方法的调用. 动态代理:在程序运行时,根据被 ...
- java 反射之静态and动态代理
首先说一下我们什么情况下使用代理? (1)设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,我们在工作中有时会接手很多前人的代码,里面代码逻辑让人摸不着头脑(sometimes the c ...
- 利用Java反射根据类的名称获取属性信息和父类的属性信息
代码: import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java ...
- Java基础加强-(注解,动态代理,类加载器,servlet3.0新特性)
1. Annotation注解 1.1. Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annota ...
- JAVASE(十八) 反射: Class的获取、ClassLoader、反射的应用、动态代理
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.反射(JAVA Reflection)的理解 1.1 什么是反射(JAVA Reflection) ...
- Java 动态代理 两种实现方法
AOP的拦截功能是由java中的动态代理来实现的.说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常时候执 ...
- 动态代理:JDK原生动态代理(Java Proxy)和CGLIB动态代理原理+附静态态代理
本文只是对原文的梳理总结,以及自行理解.自己总结的比较简单,而且不深入,不如直接看原文.不过自己梳理一遍更有助于理解. 详细可参考原文:http://www.cnblogs.com/Carpenter ...
- java开发必学知识:动态代理
目录 1. 引言 2. 代理模式及静态代理 2.1 代理模式说明 2.2 静态代理 2.3 静态代理局限性 3. 动态代理 3.1 JAVA反射机制 3.2 JDK动态代理 3.2.1 JDK动态代理 ...
- java静态代理和JDK动态代理
静态代理 编译阶段就生产了对应的代理类 public interface IBussiness { void execute(); } public class BussinessImpl imple ...
随机推荐
- c语言题目:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点
//题目:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小.也可能没有鞍点. // #include "stdio.h" #include <stdli ...
- oracle 游标-------转
-- 声明游标:CURSOR cursor_name IS select_statement --For 循环游标 --(1)定义游标 --(2)定义游标变量 --(3)使用for循环来使用这个游标 ...
- 发送邮件java实现
下面代码可以实现普通qq邮箱发送邮件的功能,可以传附件,但是是固定的附件: 需要两个jar包:mail.jar,activation.jar mail.jar 下载地址: http://java.su ...
- Delphi下TLabel鼠标MouseEnter、MouseLeave更改颜色失灵
在Delphi 7下,如果想在鼠标MouseEnter.MouseLeave的时候改变TLabel自身的颜色,很多人可能会采用 Label.Color := clRed;这样的方式来实现,我当初也是一 ...
- Address already in use: JVM_Bind <null>:8080
解决方法: 1重开eclipse,端口号被占用,或者杀掉进程
- 音乐ID3 中 专辑封面解析(APIC帧)
ID3V2 中 APIC 帧标识 专辑封面.前几天 百度 谷歌 都没有找到具体的说明.有点小伤人. 最好参考 Android 中的 id3.cpp 以及一个java 开源 id3 库.找到这里的规格 ...
- 【和我一起学习Unity3D】Unity3D的坐标控制
坐标这个东西,在Unity3D里面是分为几个类的,各自是Vector2,Vector3.Vector4:含义各自是:二维坐标系,三维坐标系,四维坐标系.一般做游戏呢,用到的最多的就是Vector3了. ...
- AIDL 发生异常的原因 Android java.lang.SecurityException: Binder invocation to an incorrect interface
我建立了两个project.一个是activity 的 ,一个是service 的. 在进行两个project通信时,应该有以下几点注意: 1.在activity project中引入service ...
- 谷歌识图、google识图如何知道图片相似?
转自:http://www.hahait.com/news/185.html 原理非常简单易懂.我们可以用一个快速算法,就达到基本的效果.这里的关键技术叫做“感知哈希算法”(Perceptual ha ...
- 基于maven进行spring 和mybatis的整合(Myeclpise)
学习日记:基于maven进行spring和mybatis的整合,进行分页查询 什么是maven:maven是一个项目管理工具,使用maven可以自动管理java项目的整个生命周期,包括编译.构建.测试 ...