java_反射

java_反射

类对象

类对象:类加载的产物,封装了一个类的所有信息(类名、父类、接口、属性、方法、构造方法)

• 类的对象: 基于某个类 new 出来的对象,也称为实例对象

获取类对象的三种方式

• 通过类的对象,获取类对象

Student s = new Student();
Class c = s.getClass();

• 通过类名获取类对象

Class c =  类名.class;

• 通过静态方法获取类对象

Class  c= Class.forName(“ 包名.类名 ”);

常用的方法

//获取类对象
Class c = Class  c= Class.forName(“ 包名.类名 ”);
//从方法默认调用无参数的构造方法创建对象
Object obj = c.newInstance();
//获取父类中所有的公开方法,包括父类中的方法
Method[] methods = c.getMethods();
//获取本类的所有方法,包括非公开的(private,default,protected)

Method[] dmethods = c.getDeclaredMethods();

Method[] dmethods = c.getMethod("print",String.class);
/*获取某一个方法:
getMethod(String name,class... type)
第一个参数:方法名
第二个参数:参数的数据类型
*/

工厂设计模式

• 开发中有一个非常重要的原则”开闭原则”, 所谓”开闭原则”指的是一个软件产品,应该对修改关闭,对拓展开放。

• 工厂模式:主要巨解决的是对象的创建问题,工厂的职责在于创建一个对象。

工厂模式示例
public class TestFactory {
    public static void main(String[] args) throws Exception {
        InputStream is = new FileInputStream("application.properties");
        Properties pop = new Properties();
        //流所指向的文件读取,以“=”分割成多个键值对
        pop.load(is);
        //通过键获取值
        String className = pop.getProperty("className");
        USB usb = (USB) USBFactory.getObject(className);
        usb.service();
    }
}
class USBFactory{
    public static Object getObject(String className) throws Exception{
        Class c = Class.forName(className);
        return c.newInstance();
    }
}

interface USB{
    public void service();
}

Properties(Map接口的实现,键值都是String类型)

• Properties是Map的一个实现类。load(fis)方法:会指向输入流对应的配置文件,将配置文件一行一行的读入,并且自动以”=”做拆分,将前面的部分作为键,后面的部分作为值。

• getProperty():通过键获取值。

Properties pop = new Properties();
//流所指向的文件读取,以“=”分割成多个键值对
pop.load(InputStream input);
//通过键获取值
String className = pop.getProperty("className");

单例设计模式

• 单例模式 (Singleton) :是一种常见的设计模式,在 Java 应用中,单例对象
必须保证一个 JVM 中,该对象只有一个实例存在。

/*
实现单例的方式一:饿汉式
优点:并发效率高
缺点:空间利用率低
*/
class Singleton1{
    private static final Singleton1 s1 = new Singleton1();
    private Singleton1(){}
    public static Singleton1 getInstance(){
        return s1;
    }
}



/*
实现单例的方式二:懒汉式
优点:空间利用率高
缺点:并发效率低,必须加synchronized
*/
class Singleton2{
    private static Singleton2 s2;
    private Singleton2(){}
    public  synchronized static Singleton2 getInstance(){
        if(s2==null)
            s2=new Singleton2();
        return s2;
    }
}



/*
实现单例的方式三:(最优)
通过内部类实现创建单例对象
*/
class Singleton3{
    private static class Inner{
        static Singleton3 instance = new Singleton3();
    }
    private Singleton3(){}
    public static Singleton3 getInstance(){
        return Inner.instance;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值