反射以及实例

类对象
•  类的对象: 基于某个类  new  出来的对象,也称为实例对象 。
•  类对象:类加载的产物,封装了一个类的所有信息(类名、父类、接口、
属性、方法、构造方法)
获取类对象
•  通过类的对象,获取类对象
    •  Student s = new Student();
    •  Class c = s.getClass();
•  通过类名获取类对象
    •  Class c =  类名.class;
•  通过静态方法获取类对象
    •  Class c=Class.forName(“ 包名. . 类名");
工厂设计模式

• 开发中有一个非常重要的原则” ” 开闭原则 “, 所谓” ” 开闭原则” ” 指的是一个软件
产品,应该对修改关闭,对拓展开放。
• 工厂模式:主要解决的是对象创建的问题, , 工厂的职责在于创建一个对象。

单例设计模式

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

反射实例

常用方法:

package reflect;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestGetClassInfo {
    public static void main(String[] args) throws NoSuchMethodException, SecurityException {
        //1.通过类的对象,获取类对象
        Student s1 = new Student(); //类的对象
        Class studentClass = s1.getClass(); //获取该对象的真实Class类型(真实类型)
        System.out.println(studentClass.getName()); //获取父类的名字
        Class superClass = studentClass.getSuperclass(); //获取父类的对象
        System.out.println(superClass.getName());
        superClass.getInterfaces();
        Field[] fields = studentClass.getDeclaredFields(); //获得所有属性

        for (Field field : fields) {
            System.out.println(field.getName());
        }

        Method[] methods = studentClass.getDeclaredMethods();

        Method m2 = studentClass.getDeclaredMethod("m2", null);


        try {
            m2.invoke(new Student(), null);
        } catch (IllegalAccessException | IllegalArgumentException
                | InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

class Student implements Serializable,Comparable<Student>{
    public int a;
    public int b;
    @Override
    public int compareTo(Student o) {
        return 0;
    }
    public void m2(){
        System.out.println("-------");
    }
}

工厂设计模式

package reflect;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * 通用编程
 * @author WDreamIn
 *
 */
public class TestObjectFactory {

    public static void main(String[] args) throws Exception {

        InputStream is = new FileInputStream("bin\\application.properties"); //key-value

        Properties prop = new Properties();

        prop.load(is);
        String className = prop.getProperty("className");
        USB usb = (USB) USBFactory.getOject(className);
        usb.service();
    }
}

//通用编程
class USBFactory{
    public static Object getOject(String className) throws Exception{
        return  Class.forName(className).newInstance();
    }
}

interface USB{
    public void service();
}

class Fan implements USB{
    @Override
    public void service() {
        System.out.println("通电---旋转");
    }
}

class Lamp implements USB{
    @Override
    public void service() {
        System.out.println("通电---照明");
    }
}

调用任何一个对象的实例方法

package reflect;

import java.lang.reflect.Method;

public class TestCommons {

    public static void main(String[] args) throws Exception {
        method(new Students(),"sayHi",new Class[]{int.class},20);
    }
    //调用任何一个对象的实例方法
    private static void method(Object obj,String methodName,Class[] params,Object... values) throws Exception {
        //获取类对象
        Class c = obj.getClass();

        //获取Method对象
        Method m = c.getMethod(methodName, params);

        //调用invoke()
        m.invoke(obj, values);
    }

}

class Students {
    public void sayHi() {

    }

    public void sayHi(int n) {
        System.out.println("Hello");
    }

    public void sayHi(int n, int x) {

    }
}

单例模式三种实现方式

package reflect;

public class TestSingleton {

    public static void main(String[] args) throws ClassNotFoundException {
        Class c = Class.forName("reflect.Singleton");

        Singleton ins1 = Singleton.getInstance();
        Singleton ins2 = Singleton.getInstance();

        System.out.println(ins1 + "\t" + ins2);
        //10 个小时不需要(占用资源)
    }
}
//饿汉式
//class Singleton{
//  //可能浪费资源
//  private static final Singleton instance = new Singleton();
//  static{
//      System.out.println("Singleton static block");
//  }
//  //私有构造
//  private Singleton(){}
//  
//  //返回一个本类的对象
//  public static Singleton getInstance(){
//      return instance;
//  }
//}

//懒汉式
//class Singleton{
//  private static Singleton instance = null; 
//  
//  private Singleton(){}
//  //为保证线程安全,需要加锁
//  public static synchronized Singleton getInstance(){
//      if(instance == null){
//          instance = new Singleton(); //new 一次
//      }
//      return instance;
//  }
//}
//智汉式
class Singleton{
    //以静态内部类形式 不算浪费资源 线程安全
    private static class Inner{
        static Singleton instance = new Singleton();
    }
    public static Singleton getInstance(){
        return Inner.instance;
    }
    private Singleton() {}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值