本文是课上资料的总结非原创没有转载地址
getClass();
方法,获取类对象Student s = new Student();
Class<?> c = s.getClass();
Class<?> c = 类名.class;
Class<?> c = Class.forName("包名.类名");
Constructor<?>[] constructors = c.getConstructors();
Constructor<?>[] constructors = c.getDeclaredConstructors();
Constructor<?> constructor = c.getConstructor();
// 使用获取的构造方法(返回值是Object)
Object s = constructor.newInstance();
Constructor<?> constructor = class1.getConstructor(int.class, String.class, int.class, String.class); //参数类型的类对象逗号分开
Object s = constructor.newInstance(110, "张三", 20, "北京"); // 有参构造
Object s = c.newInstance();// 调用无参构造方法
/*
直接使用是由构造方法,抛出IllegalAccessException非法访问异常
解决方法:使访问权限失效
*/
Constructor<?> constructor = c.getDeclaredConstructor(int.class);
// 使访问权限失效
constructor.setAccessible(true);
Object s = constructor.newInstance(112);
Method[] methods = c.getMethods();
Method[] methods = c.getDeclaredMethods();
Method method_show = c.getMethod("show");
method_show.invoke(s); // 等同于s.show();
Method method_show1 = c.getMethod("show", String.class);
method_show1.invoke(s, "15458956245");
Method method_getName = c.getMethod("getName");
String name = (String) method_getName.invoke(s);
Method method_print = c.getMethod("print");
method_print.invoke(null); // Student.print();
Method method_show2 = c.getDeclaredMethod("show");
method_show2.setAccessible(true);
method_show2.invoke(s);
Field[] fields = c.getDeclaredFields();
Field stuNo = c.getDeclaredField("stuNo");
stuNo.setAccessible(true);
stuNo.set(s, 200); // 相当于zhangsan.stuNo = 200;
System.out.println(stuNo.get(s)); // zhangsan.stuNo;
Method method_printNames = c.getMethod("printNames", String[].class);
method_printNames.invoke(s, new String[]{"张三", "李四"}); // s.printNames();
Method method_printNames = c.getMethod("printNames", String[].class);
method_printNames.invoke(s, (Object) new String[]{"张三", "李四"}); // s.printNames();
/**
* 汽车接口
*/
public interface CarService {
// 行驶
void run();
// 转向
void turn(String direction);
}
注意:此位置记住,后续还需把文件拷贝回来,拷贝出去是防止后续步骤误删此处文件
全类名
(快捷键:选中文件Ctrl+Alt+Shift+C)注意:一行一个
public class Demo {
public static void main(String[] args) {
BufferedReader br = null;
try{
br = new BufferedReader(new FileReader("CarClass.txt"));
String data = null;
while ((data = br.readLine()) != null) {
Class<?> myClass = Class.forName(data);
if (myClass != null) {
Object car = myClass.newInstance();
if (car instanceof CarService) {
CarService carService = (CarService) car;
carService.run();
carService.turn("西");
}
}
}
} catch(Exception e) {
System.out.println("加载失败:" + e.getMessage());
} finally {
br.close();
}
}
}
public class Demo {
public static void main(String[] args) throws Exception {
// 1.使用反射创建一个Car对象
Class<?> class1 = Class.forName("night.Car");
Object mycar = class1.newInstance();
System.out.println(mycar.toString());
// 2.使用反射给属性赋值,不能使用字段
// 基础方法
/*Field field = class1.getDeclaredField("brand");
Method setBrand = class1.getMethod("setBrand", field.getType());*/
// 3.使用内省属性赋值(已知属性名)
PropertyDescriptor pd1 = new PropertyDescriptor("brand", class1);
Method setBrand = pd1.getWriteMethod();
setBrand.invoke(mycar, "宝马");
PropertyDescriptor pd2 = new PropertyDescriptor("color", class1);
Method setColor = pd2.getWriteMethod();
setColor.invoke(mycar, "红色");
PropertyDescriptor pd3 = new PropertyDescriptor("price", class1);
Method setPrice = pd3.getWriteMethod();
setPrice.invoke(mycar, 100000);
System.out.println(mycar.toString());
// 4.使用BeanInfo获取类的信息
BeanInfo beanInfo = Introspector.getBeanInfo(class1);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
System.out.println(pd.getName() + " : " + pd.getPropertyType());
}
}
}
/**
* 使用饿汉子实现单例
* 特点:
* (1)类一加载就实例化,没有线程安全问题
* (2)生命周期长
*/
public class SingleTon {
// 1.私有化构造方法
private SingleTon() {
}
// 2.在内部创建这个对象
private static final SingleTon INSTANCE = new SingleTon();
// 3.公开的方法,返回这个对象
public static SingleTon getInstance() {
return INSTANCE;
}
}
注意:可以被反射破解
/**
* 使用饿汉子实现单例
* 特点:
* (1)类一加载就实例化,没有线程安全问题
* (2)生命周期长
*/
public class SingleTon {
private static boolean flag = true;
// 1.私有化构造方法
public SingleTon() {
if (flag) {
flag = false;
} else {
throw new RuntimeException("禁止反射破解");
}
}
// 2.在内部创建这个对象
private static final SingleTon INSTANCE = new SingleTon();
// 3.公开的方法,返回这个对象
public static SingleTon getInstance() {
return INSTANCE;
}
}
注意:无法完全解决反射破解问题
/**
* 懒汉子写法:
* 特点:
* (1)不使用,不会实例化
* (2)有线程安全问题,生命周期短
*/
public class SingleTon2 {
// 1.私有化构造方法
private SingleTon2() {
}
// 2.在内部创建对象
private static SingleTon2 instance;
// 3.创建一个方法返回这个对象
public static SingleTon2 getInstance() {
if (instance == null) {
instance = new SingleTon2();
}
return instance;
}
}
注意:
多线程时可能出现同时在if里睡眠,导致多个线程同时new SingleTon2();
/**
* 懒汉子写法:
* 特点:
* (1)不使用,不会实例化
* (2)有线程安全问题,生命周期短
*/
public class SingleTon2 {
// 1.私有化构造方法
private SingleTon2() {
}
// 2.在内部创建对象
private static SingleTon2 instance;
// 3.创建一个方法返回这个对象
public static SingleTon2 getInstance() {
synchronized (SingleTon2.class) {
if (instance == null) {
instance = new SingleTon2();
}
}
return instance;
}
}
注意:
改进一,容易使多个线程同时进入锁(判断锁)导致形成重量级锁,影响程序执行效率
注意:实例化对象时,正常执行步骤1–>2–>3,但JVM可能会优化成1–>3–>2
/**
* 懒汉子写法:
* 特点:
* (1)不使用,不会实例化
* (2)有线程安全问题,生命周期短
*/
public class SingleTon2 {
// 1.私有化构造方法
private SingleTon2() {
}
// 2.在内部创建对象
private static SingleTon2 instance;
// 3.创建一个方法返回这个对象
public static SingleTon2 getInstance() {
if (instance == null) { // 目的:提高执行效率
synchronized (SingleTon2.class) {
if (instance == null) {
instance = new SingleTon2(); // [^1]
}
}
}
return instance;
}
}
注意:
外层if只是提高效率
[^1]: 如果此处实例化对象的步骤为1–>3–>2多线程有可能报空指针异常
/**
* 懒汉子写法:
* 特点:
* (1)不使用,不会实例化
* (2)有线程安全问题,生命周期短
*/
public class SingleTon2 {
private static boolean flag = true;
// 1.私有化构造方法
public SingleTon2() {
if (flag) {
flag = false;
} else {
throw new RuntimeException("禁止反射破解");
}
}
// 2.在内部创建对象
private volatile static SingleTon2 instance;
// 3.创建一个方法返回这个对象
public static SingleTon2 getInstance() {
if (instance == null) { // 目的:提高执行效率
synchronized (SingleTon2.class) {
if (instance == null) {
instance = new SingleTon2();
}
}
}
return instance;
}
}
/**
* 静态内部类写法
* 特点:
* (1)生命周期解决了
* (2)线程安全也没有
*/
public class SingleTon3 {
private static boolean flag = true;
private SingleTon3() {
if (flag) {
flag = false;
} else {
throw new RuntimeException("禁止反射破解");
}
}
// 静态内部类(不使用不执行,调用静态内部类才执行)
private static class Holder {
private static final SingleTon3 INSTANCE = new SingleTon3();
}
public static SingleTon3 getInstance() {
return Holder.INSTANCE;
}
}
public abstract class Clothes {
// 准备布料
public abstract void prepare();
// 制作
public abstract void make();
// 打包
public abstract void box();
}
public class Trousers extends Clothes {
@Override
public void prepare() {
System.out.println("开始准备裤子布料");
}
@Override
public void make() {
System.out.println("开始制作裤子。。。");
System.out.println("。。。。。。");
System.out.println("裤子制作完毕");
}
@Override
public void box() {
System.out.println("开始打包裤子。。。");
}
}
T恤(TShirt)
public class TShirt extends Clothes {
@Override
public void prepare() {
System.out.println("开始准备T恤布料");
}
@Override
public void make() {
System.out.println("开始制作T恤。。。");
System.out.println("。。。。。。");
System.out.println("T恤制作完毕");
}
@Override
public void box() {
System.out.println("开始打包T恤。。。");
}
}
夹克(Jacket)
public class Jacket extends Clothes {
@Override
public void prepare() {
System.out.println("开始准备夹克布料");
}
@Override
public void make() {
System.out.println("开始制作夹克。。。");
System.out.println("。。。。。。");
System.out.println("夹克制作完毕");
}
@Override
public void box() {
System.out.println("开始打包夹克。。。");
}
}
1=night.demo.Trousers
2=night.demo.TShirt
3=night.demo.Jacket
/**
* (1)开闭原则:对于扩展时开放的,对于修改时关闭的。
*/
public class ClothesFactory {
private static Properties prop = new Properties();
static {
FileReader fr = null;
try {
fr = new FileReader("clothes.properties");
prop.load(fr);
} catch (Exception e) {
System.out.println("初始化衣服失败!");
} finally {
try {
fr.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 静态方法
public static Clothes creatClothes(int type) { // type=1——T恤 2——裤子 3——夹克
Clothes clothes = null;
/*if (type==1) {
clothes = new TShirt();
} else if (type == 2) {
clothes = new Trousers();
} else if (type == 3) {
clothes = new Jacket();
}*/
if (prop.containsKey(type)) {
String className = prop.getProperty(type + "");
try {
Class<?> class1 = Class.forName(className);
clothes = (Clothes) class1.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
if (clothes != null) {
clothes.prepare();
clothes.make();
clothes.box();
}
return clothes;
}
}
public class Test {
public static void main(String[] args) {
System.out.println("------------欢迎来到服装厂-----------");
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("-----------1-裤子 2-T恤 3-夹克 0-退出----------------");
int choice = sc.nextInt();
if (choice == 0) {
break;
}
Clothes clothes = ClothesFactory.creatClothes(choice);
if (clothes != null) {
System.out.println("购买成功;");
} else {
System.out.println("购买失败,请重新输入");
}
}
System.out.println("欢迎下次光临!");
}
}