- 浏览: 139808 次
- 性别:
- 来自: 重庆
最新评论
-
老梦a:
要是保存到数据库,是怎么做呢,数据流这块,不太懂。。(*^__ ...
使用flash摄像头拍照的简单实践 -
wolf521hf:
学习 最近正在看相关的文档 标记下
Spring安全权限管理(Spring Security) -
yue_hun1025:
怎么下载不了??????
java反编译工具jad下载 -
ry.china:
你把这个放到jdk的bin目录下就可以了
java反编译工具jad下载 -
幻樱释:
不知道能不能看懂哦。
javascript高级程序设计实例代码
转载:http://hacker0825.blog.163.com/blog/static/34570677201051993121226/
CGlib概述:
cglib(Code Generation Library )是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
cglib封装了asm,可以在运行期动态生成新的class。
cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。
CGlib应用:
以一个实例在简单介绍下cglib的应用。
我们模拟一个虚拟的场景,关于信息的管理。
1)原始需求是任何人可以操作信息的create,update,delete,query操作。
InfoManager.java --封装对信息的操作
cglib(Code Generation Library )是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
cglib封装了asm,可以在运行期动态生成新的class。
cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。
CGlib应用:
以一个实例在简单介绍下cglib的应用。
我们模拟一个虚拟的场景,关于信息的管理。
1)原始需求是任何人可以操作信息的create,update,delete,query操作。
InfoManager.java --封装对信息的操作
public
class
InfoManager {
// 模拟查询操作
public void query() {
System.out.println( " query " );
}
// 模拟创建操作
public void create() {
System.out.println( " create " );
}
// 模拟更新操作
public void update() {
System.out.println( " update " );
}
// 模拟删除操作
public void delete() {
System.out.println( " delete " );
}
}
InfoManagerFactory.java
--工厂类// 模拟查询操作
public void query() {
System.out.println( " query " );
}
// 模拟创建操作
public void create() {
System.out.println( " create " );
}
// 模拟更新操作
public void update() {
System.out.println( " update " );
}
// 模拟删除操作
public void delete() {
System.out.println( " delete " );
}
}
public
class
InfoManagerFactory {
private static InfoManager manger = new InfoManager();
/**
* 创建原始的InfoManager
*
* @return
*/
public static InfoManager getInstance() {
return manger;
}
}
client.java
--供客户端调用private static InfoManager manger = new InfoManager();
/**
* 创建原始的InfoManager
*
* @return
*/
public static InfoManager getInstance() {
return manger;
}
}
public
class
Client {
public static void main(String[] args) {
Client c = new Client();
c.anyonecanManager();
}
/**
* 模拟:没有任何权限要求,任何人都可以操作
*/
public void anyonecanManager() {
System.out.println( " any one can do manager " );
InfoManager manager = InfoManagerFactory.getInstance();
doCRUD(manager);
separatorLine();
}
/**
* 对Info做增加/更新/删除/查询操作
*
* @param manager
*/
private void doCRUD(InfoManager manager) {
manager.create();
manager.update();
manager.delete();
manager.query();
}
/**
* 加一个分隔行,用于区分
*/
private void separatorLine() {
System.out.println( " ################################ " );
}
}
至此,没有涉及到cglib的内容,因为需求太简单了,但是接下来,需求发生了改变,要求:public static void main(String[] args) {
Client c = new Client();
c.anyonecanManager();
}
/**
* 模拟:没有任何权限要求,任何人都可以操作
*/
public void anyonecanManager() {
System.out.println( " any one can do manager " );
InfoManager manager = InfoManagerFactory.getInstance();
doCRUD(manager);
separatorLine();
}
/**
* 对Info做增加/更新/删除/查询操作
*
* @param manager
*/
private void doCRUD(InfoManager manager) {
manager.create();
manager.update();
manager.delete();
manager.query();
}
/**
* 加一个分隔行,用于区分
*/
private void separatorLine() {
System.out.println( " ################################ " );
}
}
2)只有一个叫“maurice”的用户登录,才允许对信息进行create,update,delete,query的操作。
怎么办?难道在每个方法前,都加上一个权限判断吗?这样重复逻辑太多了,于是乎想到了Proxy(代理模式),但是原先的InfoManager也没有实现接口,不能采用jdk的proxy。那么cglib在这边就要隆重登场。
一旦使用cgblig,只需要添加一个MethodInterceptor的类以及修改factory代码就可以实现这个需求。
AuthProxy.java --权限校验代理类
public
class
AuthProxy
implements
MethodInterceptor {
private String name; // 会员登录名
public AuthProxy(String name) {
this .name = name;
}
/**
* 权限校验,如果会员名为:maurice,则有权限做操作,否则提示没有权限
*/
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
if ( ! " maurice " .equals( this .name)) {
System.out.println( " AuthProxy:you have no permits to do manager! " );
return null ;
}
return proxy.invokeSuper(obj, args);
}
public String getName() {
return name;
}
public void setName(String name) {
this .name = name;
}
}
InfoManagerFactory.java
--代码变动如下:private String name; // 会员登录名
public AuthProxy(String name) {
this .name = name;
}
/**
* 权限校验,如果会员名为:maurice,则有权限做操作,否则提示没有权限
*/
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
if ( ! " maurice " .equals( this .name)) {
System.out.println( " AuthProxy:you have no permits to do manager! " );
return null ;
}
return proxy.invokeSuper(obj, args);
}
public String getName() {
return name;
}
public void setName(String name) {
this .name = name;
}
}
public
class
InfoManagerFactory {
/**
* 创建带有权限检验的InfoManager
*
* @param auth
* @return
*/
public static InfoManager getAuthInstance(AuthProxy auth) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(InfoManager. class );
enhancer.setCallback(auth);
return (InfoManager) enhancer.create();
}
}
client.java
--代码修改如下/**
* 创建带有权限检验的InfoManager
*
* @param auth
* @return
*/
public static InfoManager getAuthInstance(AuthProxy auth) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(InfoManager. class );
enhancer.setCallback(auth);
return (InfoManager) enhancer.create();
}
}
public
class
Client {
public static void main(String[] args) {
Client c = new Client();
c.haveNoAuthManager();
c.haveAuthManager();
}
/**
* 模拟:登录会员没有权限
*/
public void haveNoAuthManager() {
System.out.println( " the loginer's name is not maurice,so have no permits do manager " );
InfoManager noAuthManager = InfoManagerFactory.getAuthInstance( new AuthProxy( " maurice1 " ));
doCRUD(noAuthManager);
separatorLine();
}
/**
* 模拟:登录会员有权限
*/
public void haveAuthManager() {
System.out.println( " the loginer's name is maurice,so have permits do manager " );
InfoManager authManager = InfoManagerFactory.getAuthInstance( new AuthProxy( " maurice " ));
doCRUD(authManager);
separatorLine();
}
/**
* 对Info做增加/更新/删除/查询操作
*
* @param manager
*/
private void doCRUD(InfoManager manager) {
manager.create();
manager.update();
manager.delete();
manager.query();
}
/**
* 加一个分隔行,用于区分
*/
private void separatorLine() {
System.out.println( " ################################ " );
}
}
执行下代码,发现这时client端中已经加上了权限校验。public static void main(String[] args) {
Client c = new Client();
c.haveNoAuthManager();
c.haveAuthManager();
}
/**
* 模拟:登录会员没有权限
*/
public void haveNoAuthManager() {
System.out.println( " the loginer's name is not maurice,so have no permits do manager " );
InfoManager noAuthManager = InfoManagerFactory.getAuthInstance( new AuthProxy( " maurice1 " ));
doCRUD(noAuthManager);
separatorLine();
}
/**
* 模拟:登录会员有权限
*/
public void haveAuthManager() {
System.out.println( " the loginer's name is maurice,so have permits do manager " );
InfoManager authManager = InfoManagerFactory.getAuthInstance( new AuthProxy( " maurice " ));
doCRUD(authManager);
separatorLine();
}
/**
* 对Info做增加/更新/删除/查询操作
*
* @param manager
*/
private void doCRUD(InfoManager manager) {
manager.create();
manager.update();
manager.delete();
manager.query();
}
/**
* 加一个分隔行,用于区分
*/
private void separatorLine() {
System.out.println( " ################################ " );
}
}
同样是InfoManager,为什么这时能多了权限的判断呢?Factory中enhancer.create()返回的到底是什么对象呢?这个疑问将在第三部分CGlib中解释。
这边的代码,其实是介绍了cglib中的enhancer功能.
到这里,参照上面的代码,就可以使用cglib带来的aop功能了。但是为了更多介绍下cglib的功能,模拟需求再次发生变化:
3)由于query功能用户maurice才能使用,招来其他用户的强烈的抱怨,所以权限再次变更,只有create,update,delete,才需要权限保护,query任何人都可以使用。
怎么办?采用AuthProxy,使得InfoManager中的所有方法都被代理,加上了权限的判断。当然,最容易想到的办法,就是在AuthProxy的intercept的方法中再做下判断,如果代理的method是query,不需要权限验证。这么做,可以,但是一旦逻辑比较复杂的时候,intercept这个方法要做的事情会很多,逻辑会异常的复杂。
幸好,cglib还提供了CallbackFilter。使用CallbackFilter,可以明确表明,被代理的类(InfoManager)中不同的方法,被哪个拦截器(interceptor)拦截。
AuthProxyFilter.java
public
class
AuthProxyFilter
implements
CallbackFilter {
private static final int AUTH_NEED = 0 ;
private static final int AUTH_NOT_NEED = 1 ;
/**
* <pre>
* 选择使用的proxy
* 如果调用query函数,则使用第二个proxy
* 否则,使用第一个proxy
* </pre>
*/
@Override
public int accept(Method method) {
if ( " query " .equals(method.getName())) {
return AUTH_NOT_NEED;
}
return AUTH_NEED;
}
}
这段代码什么意思?其中的accept方法的意思是说,如果代理的方法是query(),那么使用第二个拦截器去拦截,如果代理的方法不是query(),那么使用第一个拦截器去拦截。所以我们只要再写一个拦截器,不做权限校验就行了。(其实,cglib中的NoOp.INSTANCE就是一个空的拦截器,只要配置上这个就可以了。)private static final int AUTH_NEED = 0 ;
private static final int AUTH_NOT_NEED = 1 ;
/**
* <pre>
* 选择使用的proxy
* 如果调用query函数,则使用第二个proxy
* 否则,使用第一个proxy
* </pre>
*/
@Override
public int accept(Method method) {
if ( " query " .equals(method.getName())) {
return AUTH_NOT_NEED;
}
return AUTH_NEED;
}
}
InfoManagerFactory.java --代码修改如下:(配置不同的拦截器和filter)
public
class
InfoManagerFactory {
/**
* 创建不同权限要求的InfoManager
*
* @param auth
* @return
*/
public static InfoManager getSelectivityAuthInstance(AuthProxy auth) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(InfoManager. class );
enhancer.setCallbacks( new Callback[] { auth, NoOp.INSTANCE });
enhancer.setCallbackFilter( new AuthProxyFilter());
return (InfoManager) enhancer.create();
}
}
记住:setCallbacks中的拦截器(interceptor)的顺序,一定要和CallbackFilter里面指定的顺序一致!!切忌。/**
* 创建不同权限要求的InfoManager
*
* @param auth
* @return
*/
public static InfoManager getSelectivityAuthInstance(AuthProxy auth) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(InfoManager. class );
enhancer.setCallbacks( new Callback[] { auth, NoOp.INSTANCE });
enhancer.setCallbackFilter( new AuthProxyFilter());
return (InfoManager) enhancer.create();
}
}
Client.java
public
class
Client {
public static void main(String[] args) {
Client c = new Client();
c.selectivityAuthManager();
}
/**
* 模拟:没有权限的会员,可以作查询操作
*/
public void selectivityAuthManager() {
System.out.println( " the loginer's name is not maurice,so have no permits do manager except do query operator " );
InfoManager authManager = InfoManagerFactory.getSelectivityAuthInstance( new AuthProxy( " maurice1 " ));
doCRUD(authManager);
separatorLine();
}
/**
* 对Info做增加/更新/删除/查询操作
*
* @param manager
*/
private void doCRUD(InfoManager manager) {
manager.create();
manager.update();
manager.delete();
manager.query();
}
/**
* 加一个分隔行,用于区分
*/
private void separatorLine() {
System.out.println( " ################################ " );
}
}
此时,对于query的权限校验已经被去掉了。public static void main(String[] args) {
Client c = new Client();
c.selectivityAuthManager();
}
/**
* 模拟:没有权限的会员,可以作查询操作
*/
public void selectivityAuthManager() {
System.out.println( " the loginer's name is not maurice,so have no permits do manager except do query operator " );
InfoManager authManager = InfoManagerFactory.getSelectivityAuthInstance( new AuthProxy( " maurice1 " ));
doCRUD(authManager);
separatorLine();
}
/**
* 对Info做增加/更新/删除/查询操作
*
* @param manager
*/
private void doCRUD(InfoManager manager) {
manager.create();
manager.update();
manager.delete();
manager.query();
}
/**
* 加一个分隔行,用于区分
*/
private void separatorLine() {
System.out.println( " ################################ " );
}
}
通过一个模拟需求,简单介绍了cglib aop功能的使用。
CGlib应用非常广,在spring,hibernate等框架中,被大量的使用。
CGlib原理:
cglib神奇吗?其实一旦了解cglib enhancer的原理,一切就真相大白了。
刚才在第二部分中,有个疑问:enhancer.create()到底返回了什么对象?
其实在刚才的例子中,cglib在代码运行期,动态生成了InfoManager的子类,并且根据CallbackFilter的accept方法,覆写了InfoManager中的所有方法--去执行相应的MethodInterceptor的intercept方法。
有兴趣的朋友可以看看我反编译的InfoManager的子类,就可以很明白知道具体的实现了。(需要有耐心才可以)
InfoManager$$EnhancerByCGLIB$$de624598.jad
//
Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: packimports(3)
// Source File Name: <generated>
package cn.eulic.codelab.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.core.Signature;
import net.sf.cglib.proxy. * ;
// Referenced classes of package cn.eulic.codelab.cglib:
// InfoManager
public class CGLIB.BIND_CALLBACKS extends InfoManager
implements Factory
{
static void CGLIB$STATICHOOK1()
{
Class class1;
ClassLoader classloader;
CGLIB$THREAD_CALLBACKS = new ThreadLocal();
classloader = (class1 = Class.forName( " cn.eulic.codelab.cglib.InfoManager$$EnhancerByCGLIB$$de624598 " )).getClassLoader();
classloader;
CGLIB$emptyArgs = new Object[ 0 ];
CGLIB$delete$ 0 $Proxy = MethodProxy.create(classloader, (CGLIB$delete$ 0 $Method = Class.forName( " cn.eulic.codelab.cglib.InfoManager " ).getDeclaredMethod( " delete " , new Class[ 0 ])).getDeclaringClass(), class1, " ()V " , " delete " , " CGLIB$delete$0 " );
CGLIB$create$ 1 $Proxy = MethodProxy.create(classloader, (CGLIB$create$ 1 $Method = Class.forName( " cn.eulic.codelab.cglib.InfoManager " ).getDeclaredMethod( " create " , new Class[ 0 ])).getDeclaringClass(), class1, " ()V " , " create " , " CGLIB$create$1 " );
CGLIB$query$ 2 $Proxy = MethodProxy.create(classloader, (CGLIB$query$ 2 $Method = Class.forName( " cn.eulic.codelab.cglib.InfoManager " ).getDeclaredMethod( " query " , new Class[ 0 ])).getDeclaringClass(), class1, " ()V " , " query " , " CGLIB$query$2 " );
CGLIB$update$ 3 $Proxy = MethodProxy.create(classloader, (CGLIB$update$ 3 $Method = Class.forName( " cn.eulic.codelab.cglib.InfoManager " ).getDeclaredMethod( " update " , new Class[ 0 ])).getDeclaringClass(), class1, " ()V " , " update " , " CGLIB$update$3 " );
CGLIB$finalize$ 4 $Proxy = MethodProxy.create(classloader, (CGLIB$finalize$ 4 $Method = Class.forName( " java.lang.Object " ).getDeclaredMethod( " finalize " , new Class[ 0 ])).getDeclaringClass(), class1, " ()V " , " finalize " , " CGLIB$finalize$4 " );
CGLIB$hashCode$ 5 $Proxy = MethodProxy.create(classloader, (CGLIB$hashCode$ 5 $Method = Class.forName( " java.lang.Object " ).getDeclaredMethod( " hashCode " , new Class[ 0 ])).getDeclaringClass(), class1, " ()I " , " hashCode " , " CGLIB$hashCode$5 " );
CGLIB$clone$ 6 $Proxy = MethodProxy.create(classloader, (CGLIB$clone$ 6 $Method = Class.forName( " java.lang.Object " ).getDeclaredMethod( " clone " , new Class[ 0 ])).getDeclaringClass(), class1, " ()Ljava/lang/Object; " , " clone " , " CGLIB$clone$6 " );
CGLIB$equals$ 7 $Proxy = MethodProxy.create(classloader, (CGLIB$equals$ 7 $Method = Class.forName( " java.lang.Object " ).getDeclaredMethod( " equals " , new Class[] {
Class.forName( " java.lang.Object " )
})).getDeclaringClass(), class1, " (Ljava/lang/Object;)Z " , " equals " , " CGLIB$equals$7 " );
CGLIB$toString$ 8 $Proxy = MethodProxy.create(classloader, (CGLIB$toString$ 8 $Method = Class.forName( " java.lang.Object " ).getDeclaredMethod( " toString " , new Class[ 0 ])).getDeclaringClass(), class1, " ()Ljava/lang/String; " , " toString " , " CGLIB$toString$8 " );
return ;
}
final void CGLIB$delete$ 0 ()
{
super .delete();
}
public final void delete()
{
CGLIB$CALLBACK_0;
if (CGLIB$CALLBACK_0 != null ) goto _L2; else goto _L1
_L1:
JVM INSTR pop ;
CGLIB$BIND_CALLBACKS( this );
CGLIB$CALLBACK_0;
_L2:
JVM INSTR dup ;
JVM INSTR ifnull 37 ;
goto _L3 _L4
_L3:
break MISSING_BLOCK_LABEL_21;
_L4:
break MISSING_BLOCK_LABEL_37;
this ;
CGLIB$delete$ 0 $Method;
CGLIB$emptyArgs;
CGLIB$delete$ 0 $Proxy;
intercept();
return ;
super .delete();
return ;
}
final void CGLIB$create$ 1 ()
{
super .create();
}
public final void create()
{
CGLIB$CALLBACK_0;
if (CGLIB$CALLBACK_0 != null ) goto _L2; else goto _L1
_L1:
JVM INSTR pop ;
CGLIB$BIND_CALLBACKS( this );
CGLIB$CALLBACK_0;
_L2:
JVM INSTR dup ;
JVM INSTR ifnull 37 ;
goto _L3 _L4
_L3:
break MISSING_BLOCK_LABEL_21;
_L4:
break MISSING_BLOCK_LABEL_37;
this ;
CGLIB$create$ 1 $Method;
CGLIB$emptyArgs;
CGLIB$create$ 1 $Proxy;
intercept();
return ;
super .create();
return ;
}
final void CGLIB$query$ 2 ()
{
super .query();
}
public final void query()
{
CGLIB$CALLBACK_0;
if (CGLIB$CALLBACK_0 != null ) goto _L2; else goto _L1
_L1:
JVM INSTR pop ;
CGLIB$BIND_CALLBACKS( this );
CGLIB$CALLBACK_0;
_L2:
JVM INSTR dup ;
JVM INSTR ifnull 37 ;
goto _L3 _L4
_L3:
break MISSING_BLOCK_LABEL_21;
_L4:
break MISSING_BLOCK_LABEL_37;
this ;
CGLIB$query$ 2 $Method;
CGLIB$emptyArgs;
CGLIB$query$ 2 $Proxy;
intercept();
return ;
super .query();
return ;
}
final void CGLIB$update$ 3 ()
{
super .update();
}
public final void update()
{
CGLIB$CALLBACK_0;
if (CGLIB$CALLBACK_0 != null ) goto _L2; else goto _L1
_L1:
JVM INSTR pop ;
CGLIB$BIND_CALLBACKS( this );
CGLIB$CALLBACK_0;
_L2:
JVM INSTR dup ;
JVM INSTR ifnull 37 ;
goto _L3 _L4
_L3:
break MISSING_BLOCK_LABEL_21;
_L4:
break MISSING_BLOCK_LABEL_37;
this ;
CGLIB$update$ 3 $Method;
CGLIB$emptyArgs;
CGLIB$update$ 3 $Proxy;
intercept();
return ;
super .update();
return ;
}
final void CGLIB$finalize$ 4 ()
throws Throwable
{
super .finalize();
}
protected final void finalize()
throws Throwable
{
CGLIB$CALLBACK_0;
if (CGLIB$CALLBACK_0 != null ) goto _L2; else goto _L1
_L1:
JVM INSTR pop ;
CGLIB$BIND_CALLBACKS( this );
CGLIB$CALLBACK_0;
_L2:
JVM INSTR dup ;
JVM INSTR ifnull 37 ;
goto _L3 _L4
_L3:
break MISSING_BLOCK_LABEL_21;
_L4:
break MISSING_BLOCK_LABEL_37;
this ;
CGLIB$finalize$ 4 $Method;
CGLIB$emptyArgs;
CGLIB$finalize$ 4 $Proxy;
intercept();
return ;
super .finalize();
return ;
}
final int CGLIB$hashCode$ 5 ()
{
return super .hashCode();
}
public final int hashCode()
{
CGLIB$CALLBACK_0;
if (CGLIB$CALLBACK_0 != null ) goto _L2; else goto _L1
_L1:
JVM INSTR pop ;
CGLIB$BIND_CALLBACKS( this );
CGLIB$CALLBACK_0;
_L2:
JVM INSTR dup ;
JVM INSTR ifnull 52 ;
goto _L3 _L4
_L3:
this ;
CGLIB$hashCode$ 5 $Method;
CGLIB$emptyArgs;
CGLIB$hashCode$ 5 <spa
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: packimports(3)
// Source File Name: <generated>
package cn.eulic.codelab.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.core.Signature;
import net.sf.cglib.proxy. * ;
// Referenced classes of package cn.eulic.codelab.cglib:
// InfoManager
public class CGLIB.BIND_CALLBACKS extends InfoManager
implements Factory
{
static void CGLIB$STATICHOOK1()
{
Class class1;
ClassLoader classloader;
CGLIB$THREAD_CALLBACKS = new ThreadLocal();
classloader = (class1 = Class.forName( " cn.eulic.codelab.cglib.InfoManager$$EnhancerByCGLIB$$de624598 " )).getClassLoader();
classloader;
CGLIB$emptyArgs = new Object[ 0 ];
CGLIB$delete$ 0 $Proxy = MethodProxy.create(classloader, (CGLIB$delete$ 0 $Method = Class.forName( " cn.eulic.codelab.cglib.InfoManager " ).getDeclaredMethod( " delete " , new Class[ 0 ])).getDeclaringClass(), class1, " ()V " , " delete " , " CGLIB$delete$0 " );
CGLIB$create$ 1 $Proxy = MethodProxy.create(classloader, (CGLIB$create$ 1 $Method = Class.forName( " cn.eulic.codelab.cglib.InfoManager " ).getDeclaredMethod( " create " , new Class[ 0 ])).getDeclaringClass(), class1, " ()V " , " create " , " CGLIB$create$1 " );
CGLIB$query$ 2 $Proxy = MethodProxy.create(classloader, (CGLIB$query$ 2 $Method = Class.forName( " cn.eulic.codelab.cglib.InfoManager " ).getDeclaredMethod( " query " , new Class[ 0 ])).getDeclaringClass(), class1, " ()V " , " query " , " CGLIB$query$2 " );
CGLIB$update$ 3 $Proxy = MethodProxy.create(classloader, (CGLIB$update$ 3 $Method = Class.forName( " cn.eulic.codelab.cglib.InfoManager " ).getDeclaredMethod( " update " , new Class[ 0 ])).getDeclaringClass(), class1, " ()V " , " update " , " CGLIB$update$3 " );
CGLIB$finalize$ 4 $Proxy = MethodProxy.create(classloader, (CGLIB$finalize$ 4 $Method = Class.forName( " java.lang.Object " ).getDeclaredMethod( " finalize " , new Class[ 0 ])).getDeclaringClass(), class1, " ()V " , " finalize " , " CGLIB$finalize$4 " );
CGLIB$hashCode$ 5 $Proxy = MethodProxy.create(classloader, (CGLIB$hashCode$ 5 $Method = Class.forName( " java.lang.Object " ).getDeclaredMethod( " hashCode " , new Class[ 0 ])).getDeclaringClass(), class1, " ()I " , " hashCode " , " CGLIB$hashCode$5 " );
CGLIB$clone$ 6 $Proxy = MethodProxy.create(classloader, (CGLIB$clone$ 6 $Method = Class.forName( " java.lang.Object " ).getDeclaredMethod( " clone " , new Class[ 0 ])).getDeclaringClass(), class1, " ()Ljava/lang/Object; " , " clone " , " CGLIB$clone$6 " );
CGLIB$equals$ 7 $Proxy = MethodProxy.create(classloader, (CGLIB$equals$ 7 $Method = Class.forName( " java.lang.Object " ).getDeclaredMethod( " equals " , new Class[] {
Class.forName( " java.lang.Object " )
})).getDeclaringClass(), class1, " (Ljava/lang/Object;)Z " , " equals " , " CGLIB$equals$7 " );
CGLIB$toString$ 8 $Proxy = MethodProxy.create(classloader, (CGLIB$toString$ 8 $Method = Class.forName( " java.lang.Object " ).getDeclaredMethod( " toString " , new Class[ 0 ])).getDeclaringClass(), class1, " ()Ljava/lang/String; " , " toString " , " CGLIB$toString$8 " );
return ;
}
final void CGLIB$delete$ 0 ()
{
super .delete();
}
public final void delete()
{
CGLIB$CALLBACK_0;
if (CGLIB$CALLBACK_0 != null ) goto _L2; else goto _L1
_L1:
JVM INSTR pop ;
CGLIB$BIND_CALLBACKS( this );
CGLIB$CALLBACK_0;
_L2:
JVM INSTR dup ;
JVM INSTR ifnull 37 ;
goto _L3 _L4
_L3:
break MISSING_BLOCK_LABEL_21;
_L4:
break MISSING_BLOCK_LABEL_37;
this ;
CGLIB$delete$ 0 $Method;
CGLIB$emptyArgs;
CGLIB$delete$ 0 $Proxy;
intercept();
return ;
super .delete();
return ;
}
final void CGLIB$create$ 1 ()
{
super .create();
}
public final void create()
{
CGLIB$CALLBACK_0;
if (CGLIB$CALLBACK_0 != null ) goto _L2; else goto _L1
_L1:
JVM INSTR pop ;
CGLIB$BIND_CALLBACKS( this );
CGLIB$CALLBACK_0;
_L2:
JVM INSTR dup ;
JVM INSTR ifnull 37 ;
goto _L3 _L4
_L3:
break MISSING_BLOCK_LABEL_21;
_L4:
break MISSING_BLOCK_LABEL_37;
this ;
CGLIB$create$ 1 $Method;
CGLIB$emptyArgs;
CGLIB$create$ 1 $Proxy;
intercept();
return ;
super .create();
return ;
}
final void CGLIB$query$ 2 ()
{
super .query();
}
public final void query()
{
CGLIB$CALLBACK_0;
if (CGLIB$CALLBACK_0 != null ) goto _L2; else goto _L1
_L1:
JVM INSTR pop ;
CGLIB$BIND_CALLBACKS( this );
CGLIB$CALLBACK_0;
_L2:
JVM INSTR dup ;
JVM INSTR ifnull 37 ;
goto _L3 _L4
_L3:
break MISSING_BLOCK_LABEL_21;
_L4:
break MISSING_BLOCK_LABEL_37;
this ;
CGLIB$query$ 2 $Method;
CGLIB$emptyArgs;
CGLIB$query$ 2 $Proxy;
intercept();
return ;
super .query();
return ;
}
final void CGLIB$update$ 3 ()
{
super .update();
}
public final void update()
{
CGLIB$CALLBACK_0;
if (CGLIB$CALLBACK_0 != null ) goto _L2; else goto _L1
_L1:
JVM INSTR pop ;
CGLIB$BIND_CALLBACKS( this );
CGLIB$CALLBACK_0;
_L2:
JVM INSTR dup ;
JVM INSTR ifnull 37 ;
goto _L3 _L4
_L3:
break MISSING_BLOCK_LABEL_21;
_L4:
break MISSING_BLOCK_LABEL_37;
this ;
CGLIB$update$ 3 $Method;
CGLIB$emptyArgs;
CGLIB$update$ 3 $Proxy;
intercept();
return ;
super .update();
return ;
}
final void CGLIB$finalize$ 4 ()
throws Throwable
{
super .finalize();
}
protected final void finalize()
throws Throwable
{
CGLIB$CALLBACK_0;
if (CGLIB$CALLBACK_0 != null ) goto _L2; else goto _L1
_L1:
JVM INSTR pop ;
CGLIB$BIND_CALLBACKS( this );
CGLIB$CALLBACK_0;
_L2:
JVM INSTR dup ;
JVM INSTR ifnull 37 ;
goto _L3 _L4
_L3:
break MISSING_BLOCK_LABEL_21;
_L4:
break MISSING_BLOCK_LABEL_37;
this ;
CGLIB$finalize$ 4 $Method;
CGLIB$emptyArgs;
CGLIB$finalize$ 4 $Proxy;
intercept();
return ;
super .finalize();
return ;
}
final int CGLIB$hashCode$ 5 ()
{
return super .hashCode();
}
public final int hashCode()
{
CGLIB$CALLBACK_0;
if (CGLIB$CALLBACK_0 != null ) goto _L2; else goto _L1
_L1:
JVM INSTR pop ;
CGLIB$BIND_CALLBACKS( this );
CGLIB$CALLBACK_0;
_L2:
JVM INSTR dup ;
JVM INSTR ifnull 52 ;
goto _L3 _L4
_L3:
this ;
CGLIB$hashCode$ 5 $Method;
CGLIB$emptyArgs;
CGLIB$hashCode$ 5 <spa
发表评论
-
数据库JDBC驱动下载大全
2017-03-26 14:14 22621.数据库驱动下载地址 Cache : http://w ... -
MINA粘包断包专题研究
2015-05-13 00:25 0一、前述: 近期做项目用到了MINA,其中遇到了一个 ... -
Mybatis版PropertyFilter实现
2014-07-03 23:50 1515<!--前段时间看到hibernate的Proper ... -
java字符串应用之表达式解析器
2013-12-26 13:33 5266一、表达式的组成 1、数字 2、运算符:+ - ... -
全文检索Lucene使用与优化
2012-03-22 13:09 988转自http://www.oecp.cn/hi/chengzh ... -
Spring 里JMS和DB的事务集成
2012-02-10 18:59 1717http://www.javaworld.com/jav ... -
Java实现在bmp图像文件中隐藏与导出信息
2011-08-21 00:20 1396BMP图像文件,即所谓的位图文件。在位图中,其表示方式是 ... -
Spring事务配置的五种方式
2011-06-10 20:07 1001前段时间对Spring的事务配置做了比较深入的研究,在此之间对 ... -
spring2.5 mvc common-validator 集成应用
2010-12-10 12:59 2907常常写客服端验证代码,写多了就感觉是否有啥东西可以简化处理的, ... -
通过java2dAPI绘制报表
2010-12-05 21:41 1460/* *只画直线,矩形,椭圆,只能向右下角 ... -
调整 JVM 开关以提高性能
2010-12-04 16:29 1059http://blog.csdn.net/petehero/a ... -
java开源论坛系统
2010-01-04 22:52 4163java开源论坛系统 ================ m ... -
纯jsp日历
2009-12-16 09:44 1170网上找了一大堆日历,感觉跟自己的想要的有点差别,索性自己修改了 ... -
tomcat6学习笔记( 包括和apache2的集成,集群,SSI,SSL,安全域,嵌入应用程序,访问控制平台和管理平台)
2009-12-15 11:27 2457一.访问tomcat的控制平台和管理平台 首先下载tom ... -
用p6spy来观察Java程序中执行的所有SQL语句
2009-11-17 15:30 2165本想把 p6spy 结合 SQL Pro ... -
有用的ext grid 例子
2009-11-06 14:22 4335有用的ext grid 例子 ... -
Spring安全权限管理(Spring Security)
2009-11-04 14:02 6458Spring Security以前叫做acegi,是后来才成为 ... -
spring事务传播属性与隔离级别
2009-10-20 15:22 2076一、Propagation (事务的传播属性) Pro ... -
一个用Spring AOP实现异常处理和记录程序执行时间的实例
2009-10-20 15:05 31605.11 一个用Sprin ... -
最新的jsp系统与discuz整合(含源码)
2009-10-13 13:44 22341>登录discuz后台:UCenter应用管理---- ...
相关推荐
下面是一个简单的CGlib动态代理的示例: ```java import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method;...
下面将详细介绍CGLib的相关知识点。 1. **动态代理**: CGLib常用于为Java对象创建代理,以在方法调用前后添加额外的行为。比如,在Spring AOP框架中,CGLib被用来创建代理对象,实现在方法执行前后的拦截器逻辑,...
以上就是关于静态代理、动态代理(JDK)和CGlib代理的基本介绍。它们在Java开发中都有广泛的应用,尤其是在AOP(面向切面编程)和框架设计中,如Spring AOP就使用了这两种代理技术。了解并熟练掌握这些代理机制,...
通过这个库,开发者无需手动编写复杂的字节码,而是可以通过简单的API接口来创建新的类或者增强已有的类。这极大地提高了开发效率和代码的可读性,同时降低了出错的可能性。 【详细知识点】: 1. **字节码基础**:...
3. **cglib-nodep-2.1_3.jar**: CGLIB是一个代码生成库,主要用于创建代理对象,特别是在Spring AOP中,它可以动态生成子类来实现对目标类的方法拦截。 4. **commons-beanutils.jar**: 提供了访问JavaBeans组件属性...
这里我们以Druid为例,介绍其简单实现。 1. 添加依赖:在项目中引入Druid的Maven或Gradle依赖。例如,如果是Maven项目,可以在pom.xml中添加如下依赖: ```xml <groupId>com.alibaba</groupId> <artifactId>...
下面将详细介绍这两种动态代理机制。 1. JDK动态代理: JDK动态代理基于Java的接口实现。如果我们的目标对象实现了至少一个接口,那么Spring会为我们创建一个代理类,该类实现了相同的接口,并在调用接口方法时...
本示例将简要介绍如何在Spring应用中实现AOP,通过实际的代码示例帮助理解其工作原理。 首先,我们要理解AOP的核心概念。AOP是一种编程范式,它允许开发者定义“切面”(Aspects),这些切面封装了特定的关注点,如...
Commons Digester 提供了一个简单易用的框架来解析XML文档并映射到Java对象。对于需要处理XML数据的应用程序而言,它极大地简化了开发过程。 #### Commons Lang (commons-lang.jar) Commons Lang 是一个实用工具库...
本项目基于Hibernate3,将介绍如何实现最简单的查询功能,并且提供了必要的jar包以供使用。Hibernate3是Hibernate的第三个主要版本,它在性能和功能上都有所提升,同时也保持了与前一版本的良好兼容性。 首先,理解...
这里我们将深入探讨Java中的两种主要动态代理实现:JDK动态代理和CGLIB动态代理,以及静态代理作为基础概念的介绍。 首先,我们来看静态代理。静态代理是代理模式的一种实现方式,它要求我们为每个目标接口创建一个...
接着,“tiny-spring-step-2-abstract-beanfactory-and-do-bean-initilizing-in-it.zip”进一步深入,介绍了AbstractBeanFactory和Bean的初始化过程。在这个阶段,你将学习到BeanFactory如何解析XML配置,创建Bean...
有关于Spring,我们最常用的两个功能就是IOC和AOP,前几篇文章从源码级别介绍了Spring容器如何为我们生成bean及bean之间的依赖关系 下面我们接着来看AOP的源码实现。 有关于AOP,我们在面试中也被无数次问到...
下面将详细介绍这些资源包以及它们在Spring框架中的作用。 1. **asm-all-2.2.2.jar**: 这个jar包包含了ASM库的所有组件,ASM是一个Java字节码操控和分析框架,用于动态生成类或者增强已有类的功能。Spring框架在...
以上就是几个简单易懂的设计模式介绍,理解并熟练运用这些模式可以提升代码的可读性、可维护性和复用性。在实际开发中,根据项目需求和场景选择合适的设计模式,可以有效地提高软件的质量和效率。通过不断地学习和...
Spring AOP的实现方式有两种:一种是基于Java动态代理技术,另一种则是使用CGLIB库。 #### 三、AOP核心概念 - **横切关注点**:指那些分散在整个应用程序中的功能,它们通常与应用程序的主要业务逻辑分离。 - **切...
这三种代理模式各有其特点和应用场景,下面将详细介绍它们的工作原理和实现方式。 ### 静态代理 静态代理是最基础的代理形式,它通过创建一个代理类来间接调用目标对象的方法。在静态代理中,代理类和目标类通常...
【Spring AOP 详细介绍】 Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了在不修改源代码的情况下,对应用程序进行功能增强的能力。AOP的核心概念包括Advice...
- **简单易用**:集成到应用中非常简单,只需要添加相应的jar包,并进行简单的配置即可。 **3. jar包介绍** - **proxool-0.9.1.jar**:这是Proxool连接池的核心库,包含了所有必要的类和方法,用于创建、管理和维护...
- **统一jdk和cglib**:介绍Spring如何统一管理和使用JDK和CGLIB代理。 - **切点匹配**:讲解切点表达式的定义及匹配规则。 - **@Aspect与Advisor**:解释Spring AOP中的@Aspect注解和Advisor的作用。 - **静态通知*...