我想问下这里不明白

来源:2-1 JDK的动态代理

qq_蓝骏毅_04076633

2018-10-24 22:48:03

@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		if("save".equals(method.getName())) {
			
			System.out.println("权限校验....");
			
			return method.invoke(userDao, args);
			
		}
		return method.invoke(userDao, args);
	}
这里也不太明白

public Object createProxy() {
		
		Object proxy = 
				Proxy.newProxyInstance(userDao.getClass().getClassLoader(), 
						userDao.getClass().getInterfaces(), this);
		
		return proxy;
		
	}


写回答

1回答

chrismorgen

2018-10-25

如下代码是创建userDao的代理对象,可以通过Proxy类中的newProxyInstance来创建代理对象,newProxyInstance方法中需要传递3个参数,第一个参数是类的加载器,第二个参数是userDao的所有接口,第三个参数就是InvocationHandler接口,这样通过调用createProxy方法就可以获得一个userDao的动态代理对象了。

public Object createProxy() {
         
        Object proxy = 
                Proxy.newProxyInstance(userDao.getClass().getClassLoader(), 
                        userDao.getClass().getInterfaces(), this);
         
        return proxy;
         
    }

invoke方法是InvocationHandler接口中的方法,在该方法中可以对目标对象进行增强。

@Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if("save".equals(method.getName())) { 
            System.out.println("权限校验....");  
            return method.invoke(userDao, args);    
        }
        return method.invoke(userDao, args);
    }

通过描述以上代码,可以看出他的作用是什么,在视频中14分钟出左右,在demo1中创建了UserDao的代理对象proxy,也就是通过MyJDKProxy类中的createProxy方法来获取的UserDao代理对象,然后让proxy代理对象去执行save方法,默认的就会调用invoke方法进行方法增强,当方法为save方法时,就会执行权限校验了。祝学习愉快~

http://img.mukewang.com/climg/5bd12fcd0001449708750549.jpg

1

0 学习 · 4317 问题

查看课程