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;
}
}