反射机制
获取Class类的对象:
方法一:getClass(); 后面可以跟getName();getSimpleName();getTypeName();得到对象名
程序执行结果:
方法二:类.class获取;
获得Class对象名:
注:应该是com.yootk.demo.IBook
方法三:public static Class<?> forName(String name);
newInstance();
执行结果:
反射机制还可以用来做动态工厂类的实现。
反射机制调用构造方法:
反射机制调用方法:
两者的方法极其相似,对比理解更容易牢记。
类加载器ClassLoader
深入理解Java类加载器(ClassLoader)_zejian_的博客-CSDN博客_加载器
自定义Annotation
通过@Target可以设定注解可以出现的位置
如下面代码所示,其他的设置如下下图
package com.io.hxw.test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Description:
* @Author: huangxunwei
* @Date: 2022/3/29 22:18
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@interface Action{
public String value();
}
@Target({ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
@interface Instance{
public String value();
}
interface IChannnel extends AutoCloseable{
public boolean build();
}
class InternetChannel implements IChannnel{
@Override
public boolean build() {
System.out.println("【互联网通道建立成功!】");
return true;
}
@Override
public void close() throws Exception {
System.out.println("【互联网通道关闭】");
}
}
class RadioChannel implements IChannnel{
@Override
public boolean build() {
System.out.println("【无线电通道建立成功!】");
return true;
}
@Override
public void close() throws Exception {
System.out.println("【互联网通道关闭】");
}
}
class Factory{
private Factory(){}
public static <T> T getInstance(String className){
try {
return (T)Class.forName(className).getDeclaredConstructor().newInstance();
}catch (Exception e){
return null;
}
}
}
@Action("com.io.hxw.test.RadioChannel")
class Message{
private IChannnel channnel;//提供通道
@Instance("com.io.hxw.test.Factory")
public Message(){
try {
Action actionAnnotation=super.getClass().getAnnotation(Action.class);
Instance instanceAnnotation=super.getClass().getAnnotation(Instance.class);
String factoryClassName=instanceAnnotation.value();
Class factoryClazz=Class.forName(factoryClassName);
this.channnel=(IChannnel)factoryClazz.getMethod("getInstance",String.class).invoke(null,actionAnnotation.value());
}catch (Exception e){}
}
public String echo(String msg) throws Exception{
String echoMessage="【error】消息发送失败!";
if (this.channnel.build()){
echoMessage="【ECHO】"+msg;
this.channnel.close();
}
return echoMessage;
}
}
public class Test {
public static void main(String[] args) throws Exception {
System.out.println(new Message().echo("hxw"));
}
}