public class InjectViewProcessor implements ProcessorIntf{
@Override
public boolean accept(AnnotatedElement e) {
return e.isAnnotationPresent(InjectView.class);
}
@Override
public void process(Object object, View view, Field field) {
InjectView iv = field.getAnnotation(InjectView.class);
final int viewId = iv.value();
final View v = view.findViewById(viewId);
field.setAccessible(true);
try {
field.set(object, v);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
怎么还实现了一个接口呢?
public interface ProcessorIntf {
public boolean accept(AnnotatedElement t);
public void process(Object object, View view, T t);
}
/*这样看来,可以把处理行为抽象成这几个参数?
*第一个object是目标对象,
*第二个view是根view
*第三个是加上注解的那个东西
*/
public void process(Object object, View view, T e);
所以在InjectViewProcessor中是这样实现的:
@Override
public boolean accept(AnnotatedElement e) {
//如果当前这个AnnotatedElement实例加有InjectView注解,则返回true
return e.isAnnotationPresent(InjectView.class);
}
如果是返回true,说明这个它可以处理,则走到
@Override
public void process(Object object, View view, Field field) {
InjectView iv = field.getAnnotation(InjectView.class);
final int viewId = iv.value();
final View v = view.findViewById(viewId);
field.setAccessible(true);
try {
field.set(object, v);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
public class OnClickProcessor implements ProcessorIntf {
@Override
public boolean accept(AnnotatedElement e) {
return e.isAnnotationPresent(OnClick.class);
}
@Override
public void process(Object object,View view, Method method) {
final OnClick oc = method.getAnnotation(OnClick.class);
final int[] value = oc.value();
for (int id : value) {
view.findViewById(id).setOnClickListener(new InvokeOnClickListener(method,object));
}
}
private static class InvokeOnClickListener implements View.OnClickListener {
public Method method;
public WeakReference
再来分析代码:
//这个很简单,就是告诉管理器我响应OnClick注解
@Override
public boolean accept(AnnotatedElement e) {
return e.isAnnotationPresent(OnClick.class);
}
/*
* 这个也还是一样,
* 1.先拿到具体的注解对象 ,并拿到里面的值
* 2.因为存在多个id绑定到一个方法上的情况,所以一个循环不可少
* 3.就是拿到view,设置监听事件
* 4.但是,这个InvokeOnClickListener是个什么东西呢?
*/
@Override
public void process(Object object,View view, Method method) {
final OnClick oc = method.getAnnotation(OnClick.class);
final int[] value = oc.value();
for (int id : value) {
view.findViewById(id).setOnClickListener(new InvokeOnClickListener(method,object));
}
}
//先说下,这里面的InvokeOnClickListener是一个中间件,注册给系统,系统在得到点击事件后,通知给InvokeOnClickListener,在这个里面再调用你所指定的方法。
private static class InvokeOnClickListener implements View.OnClickListener {
public Method method;
public WeakReference obj;
private boolean hasParam;
InvokeOnClickListener(Method m, Object object) {
this.method = m;
this.obj = new WeakReference(object);
final Class>[] parameterTypes = method.getParameterTypes();
if (parameterTypes == null || parameterTypes.length == 0) {
hasParam = false;
} else if (parameterTypes.length > 1 || !View.class.isAssignableFrom(parameterTypes[0])) {
throw new IllegalArgumentException(String.format("%s方法只能拥有0个或一个参数,且只接收View", m.getName()));
} else {
hasParam = true;
}
}
@Override
public void onClick(View v) {
//点击事件触发了
Object o = obj.get();
if (o != null) {
try {
if (hasParam) {
method.invoke(o, v);
} else {
method.invoke(o);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
分页显示一直是web开发中一大烦琐的难题,传统的网页设计只在一个JSP或者ASP页面中书写所有关于数据库操作的代码,那样做分页可能简单一点,但当把网站分层开发后,分页就比较困难了,下面是我做Spring+Hibernate+Struts2项目时设计的分页代码,与大家分享交流。
1、DAO层接口的设计,在MemberDao接口中定义了如下两个方法:
public in
/*
*使用对象类型
*/
--建立和使用简单对象类型
--对象类型包括对象类型规范和对象类型体两部分。
--建立和使用不包含任何方法的对象类型
CREATE OR REPLACE TYPE person_typ1 as OBJECT(
name varchar2(10),gender varchar2(4),birthdate date
);
drop type p
what 什么
your 你
name 名字
my 我的
am 是
one 一
two 二
three 三
four 四
five 五
class 班级,课
six 六
seven 七
eight 八
nince 九
ten 十
zero 零
how 怎样
old 老的
eleven 十一
twelve 十二
thirteen
spring security 3中推荐使用BCrypt算法加密密码了,以前使用的是md5,
Md5PasswordEncoder 和 ShaPasswordEncoder,现在不推荐了,推荐用bcrpt
Bcrpt中的salt可以是随机的,比如:
int i = 0;
while (i < 10) {
String password = "1234
1.前言。
如题。
2.代码
(1)单表查重复数据,根据a分组
SELECT m.a,m.b, INNER JOIN (select a,b,COUNT(*) AS rank FROM test.`A` A GROUP BY a HAVING rank>1 )k ON m.a=k.a
(2)多表查询 ,
使用改为le