大部分程序员都是写业务代码的,大部分程序员都是维护老系统的,其实要我们自己写反射的代码的时候,真的不多。
从上面也看出,什么时候会写反射?写我们自己组件/框架的时候。如果想找个地练手一下反射,我觉得自定义注解是一个不错的选择。
因为现在用注解的地方很多,主要是够清晰简单(再也不用对着一堆的XML文件了,哈哈哈哈~)。
我初学的时候写过一段,可以简单参考一下,思路都差不多的哈。下面是使用的效果(使用自定义注解给不同的接口增加权限)
@permission("添加分类") void addCategory(Category category); void findCategory(String id); @permission("查找分类") List<Category> getAllCategory();
返回一个代理的Service对象来处理自定义注解:
public class ServiceDaoFactory {
private static final ServiceDaoFactory factory = new ServiceDaoFactory();
private ServiceDaoFactory() {
}
public static ServiceDaoFactory getInstance() {
return factory;
}
public <T> T createDao(String className, Class<T> clazz, final User user) {
System.out.println("添加分类进来了!");
try {
final T t = (T) Class.forName(className).newInstance();
return (T) Proxy.newProxyInstance(ServiceDaoFactory.class.getClassLoader(), t.getClass().getInterfaces(), new InvocationHandler() {
@Override public Object invoke(Object proxy, Method method, Object[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, PrivilegeException {
String methodName = method.getName();
System.out.println(methodName);
Method method1 = t.getClass().getMethod(methodName,method.getParameterTypes());
permission permis = method1.getAnnotation(permission.class);
if (permis == null) {
return method.invoke(t, args);
}
String privilege = permis.value();
Privilege p = new Privilege();
p.setName(privilege);
if (user == null) {
throw new PrivilegeException("对不起请先登陆");
}
Method m = t.getClass().getMethod("findUserPrivilege", String.class);
List<Privilege> list = (List<Privilege>) m.invoke(t, user.getId());
if (!list.contains(p)) {
throw new PrivilegeException("您没有权限,请联系管理员!");
}
return method.invoke(t, args);
}
});
} catch (Exception e) {
new RuntimeException(e);
}
return null;
}
}
原文链接:https://my.oschina.net/u/3777556/blog/3167226
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。