自定义注解
springboot 框架中定义了大量的注解,为什么加上注解之后就能实现配置了。比如@Autowired, 将 IOC 中的对象拿出来使用。
创建自定义的注解
@Target(ElementType.METHOD) //作用的目标
@Retention(RetentionPolicy.RUNTIME) //作用的时间
public @interface LogAnnotation {
public String methodName() default "";
}
在方法上面使用注解
@LogAnnotation(methodName = "print")
public void print(){
System.out.println("Hello World");
}
使用反射机制来处理注解。反射可以扫描所有的类。在这个里面可以做一些详细得到操作,比如获取方法的一些参数等
public class AnnotationProcessor {
public void process() throws NoSuchMethodException {
Method method = test.class.getMethod("print");
if (method.isAnnotationPresent(LogAnnotation.class)) {
LogAnnotation annotation = method.getAnnotation(LogAnnotation.class);
String methodName = annotation.methodName();
System.out.println(methodName);
}
}
public static void main(String[] args) {
AnnotationProcessor annotationProcessor = new AnnotationProcessor();
try {
annotationProcessor.process();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
反射
反射是 Java 框架的灵魂,通过反射可以获取任意一个类所有属性和方法,还可以调用这些属性和方法。
spring、mybatis 这些底层都是用了大量的反射机制。
想要通过反射获取到动态的信息 需要获取到 class 对象
package com.cl.jvppeteerdemo.util;
import lombok.SneakyThrows;
import java.lang.reflect.Method;
public class ReflectDemo {
public String name;
public static void sayHello(){
System.out.println("Hello World");
}
@SneakyThrows
public static void main(String[] args) {
Class<ReflectDemo> reflectDemoClass = ReflectDemo.class;
reflectDemoClass.getDeclaredMethod("sayHello").invoke(null);
}
}
代理模式、
静态代理
普通的静态代理对象
public interface SmsSerivce {
public void send();
}
public class SmsSerivceImpl implements SmsSerivce{
@Override
public void send() {
System.out.println("aaa");
}
}
Proxy 代理类
public class SMSProxy implements SmsSerivce{
private SmsSerivce smsSerivce;
public SMSProxy(SmsSerivce smsSerivce) {
this.smsSerivce = smsSerivce;
}
@Override
public void send() {
System.out.println("代理之前设置");
smsSerivce.send();
System.out.println("Proxy: SMS sent");
}
public static void main(String[] args) {
SmsSerivce smsSerivce1=new SmsSerivceImpl();
SMSProxy proxy=new SMSProxy(smsSerivce1);
proxy.send();
}
}
动态代理
package com.cl.jvppeteerdemo.静态代理;
import java.lang.reflect.Proxy;
public class JDKProxyFactory {
public static Object test(Object target){
return Proxy.newProxyInstance(
// target通带代理类
target.getClass().getClassLoader(),
//被代理类实现的接口,可以有很多
target.getClass().getInterfaces(),
//实现invovationHandler的对象
new DebugInvocationHandler(target)
);
}
public static void main(String[] args) {
SmsSerivce smsSerivce = (SmsSerivce) JDKProxyFactory.test(new SmsSerivceImpl());
smsSerivce.send();
}
}
动态代理存在的问题
只能代理实现接口的类, 如果这个类没有实现接口那么就不能实现代理。