330学习日记(反射机制获取Class的实例化对象)

反射机制

获取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"));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值