反射机制

本文详细介绍了Java反射机制的三种获取类的方法及实例化对象的过程,并通过示例展示了如何结合反射改进工厂设计模式,提高代码的扩展性和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,反射机制获取类有三种方法,
第一种利用类.class



class person{

}

public class Javaapidemo {
    public static void main(String[] args)  {
      Class cl1=person.class;
        System.out.println(cl1);

        }


    }

第二种利用实例化对象,在实例化对象.getclass

ackage file;


import java.util.Date;

public class Javaapidemo {
    public static void main(String[] args)  {
        Date date=new Date();
        System.out.println(date.getClass());
        

        }


    }

第三种在Class类里面提供有一个statiic方法;

package file;


import java.util.Date;
class  people{

}
public class Javaapidemo {
    public static void main(String[] args) throws ClassNotFoundException {
      Class cls=Class.forName("file.people");
        System.out.println(cls.getName());


        }


    }
        }


    }

反射实例化对象

package file;



class  people{
    public people() {
        System.out.println("哈哈哈哈我是个人");
    }

    @Override
    public String toString() {
        return "一个帅哥";
    }
}
public class Javaapidemo {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
      Class cls=Class.forName("file.people");
        Object obj=cls.newInstance();////创建此Class 对象所表示的类的一个新实例
        System.out.println(obj);////调用了peoplee的无参数构造方法.



        }


    }


newInstance()方法在JDK1.9被废除应为只能调用构造方法
反射与工厂设计模式
原来的工厂模式要新的厂品时要重新添加厂品线例如

package fanshe;

import com.lyh.Message;

interface message{
    public  void send();
}
class  weChat implements message{


    @Override
    public void send() {
        System.out.println("哈哈哈");
    }
}
class  qq implements  message{

    @Override
    public void send() {
        System.out.println("你是猪");

    }
}
class Factory{
    private  Factory() {
    }
    public static message getmessage(String classname){
        if ("weChat".equalsIgnoreCase(classname)){
            return new weChat();
        }else if ("qq".equalsIgnoreCase(classname)){
            return  new qq();
        }else{
            return null;
        }
    }
}
public class test {
    public static void main(String[] args) {
        message msg=Factory.getmessage("weChat");
        msg.send();

    }
}

此时·无需

package fanshe;

import com.lyh.Message;

import java.lang.reflect.InvocationTargetException;

interface message{
    public  void send();
}
class  weChat implements message{


    @Override
    public void send() {
        System.out.println("哈哈哈");
    }
}
class  qq implements  message{

    @Override
    public void send() {
        System.out.println("你是猪");

    }
}
class Factory{
    private  Factory() {
    }
    public static message getmessage(String classname) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        message instance=null;
     instance=   (message)Class.forName(classname).getDeclaredConstructor().newInstance();
       return instance;
    }
}
public class test {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        message msg=Factory.getmessage("fanshe.weChat");
        msg.send();

    }
}

当有多个接口时要用泛型解决

package fanshe;

import java.lang.reflect.InvocationTargetException;
interface IService{
    public void service();
}

interface message{
    public  void send();
}
class videoserice implements IService{

    @Override
    public void service() {
        System.out.println("我们视频吧");
    }
}
class  weChat implements message{


    @Override
    public void send() {
        System.out.println("哈哈哈");
    }
}
class  qq implements  message{

    @Override
    public void send() {
        System.out.println("你是猪");

    }
}
class Factory{
    /*
    获得接口实例化对象
    className 接口子类
    clazz描述的是有个接口类型
    return 如果子类存在则返回指定接口实例化对象
     */
    private  Factory() {
    }
    public static <T> T getmessage(String classname,Class<T> clazz) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        T instance=null;
     instance=   (T) Class.forName(classname).getDeclaredConstructor().newInstance();
       return instance;
    }
}
public class test {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        message msg=Factory.getmessage("fanshe.weChat",message.class);
        IService se=Factory.getmessage("fanshe.videoserice",IService.class);
        msg.send();
        se.service();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值