知识点
工厂模式
工厂模式可以减少代码的修改量
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
public class Factory {
public static Person createPerson(){
Person person = null;
Properties p = new Properties();
try {
p.load(new FileInputStream("config.properties"));
String clazzName = p.getProperty("person");
Class clazz = Class.forName(clazzName);
person = (Person)clazz.newInstance();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return person;
}
}
public interface Person {
public void sleep();
}
public class Teacher implements Person {
@Override
public void sleep() {
System.out.println("老师睡觉");
}
}
public class Worker implements Person {
@Override
public void sleep() {
System.out.println("工人睡觉");
}
}
public class Test {
public static void main(String[] args) {
Person person = Factory.createPerson();
person.sleep();
}
}
以下是需要解析的properties文件内容
person=com.chu.factoryModel.Teacher
反射
类Class概述
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。
/*
* 反射
*/
Class<Student> clazz = Student.class;
//Field[] fields = clazz.getFields();//以数组形式返回所有公共属性
/*Field[] fields = clazz.getDeclaredFields();//以数组形式返回所有属性
for(Field field:fields){
System.out.println(field.getName());//返回属性名称
System.out.println(field.getType());//返回属性的类型
System.out.println(field.getType().getName());//返回属性的类型名称
System.out.println(field.getModifiers());//返回属性访问修饰符的整数表示形式
}*/
Student zhangsan = new Student();
try {
Field age = clazz.getDeclaredField("age");//得到指定的属性age
age.setAccessible(true); //取消java访问修饰符检查
age.set(zhangsan, 19); //将对象zhangsan的age属性的值更改为19
age.setAccessible(false); //取消 取消java访问修饰符检查
System.out.println(zhangsan.getAge());//输出对象zhangsan的age值
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public class Student {
private String name;
private int age;
public String no;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
注解
public class Teacher {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
建立一个注解类
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)//表示此注解的范围是可执行的
@Target(ElementType.FIELD)//表示此注解只能用到属性上
public @interface ClazzAnotation {
String name();
int age() default 24;//如果age在注解中没有声明则使用默认default值
}
public class Clazz {
@ClazzAnotation(name="张三",age=27)
private Teacher javaTeacher;
@ClazzAnotation(name="李四",age=22)
private Teacher englishTeacher;
@ClazzAnotation(name="王五")
private Teacher mathTeacher;
public Clazz() {
Class clazz = this.getClass();
Field[] fields = clazz.getDeclaredFields();//得到clazz的所有属性
for(Field field:fields){
ClazzAnotation ca = field.getAnnotation(ClazzAnotation.class);//得到clazzAnotation的注解,如果没有返回null
if(ca==null){
continue;//如果为null跳出
}else{
int age = ca.age();//得到该注解的age值,如果没有则赋默认值
String name = ca.name();//得到该注解的name值
Teacher teacher = new Teacher();
teacher.setAge(age);
teacher.setName(name);//根据注解的值创建新的对象
try {
field.setAccessible(true);
field.set(this,teacher);//将这个teacher对象赋值clazz对象的该属性
field.setAccessible(false);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
public Teacher getJavaTeacher() {
return javaTeacher;
}
public void setJavaTeacher(Teacher javaTeacher) {
this.javaTeacher = javaTeacher;
}
public Teacher getEnglishTeacher() {
return englishTeacher;
}
public void setEnglishTeacher(Teacher englishTeacher) {
this.englishTeacher = englishTeacher;
}
public Teacher getMathTeacher() {
return mathTeacher;
}
public void setMathTeacher(Teacher mathTeacher) {
this.mathTeacher = mathTeacher;
}
}
public class Test {
public static void main(String[] args) {
Teacher teacher = new Clazz().getEnglishTeacher();
Teacher teacher2 = new Clazz().getJavaTeacher();
System.out.println(teacher.getName()+teacher.getAge());
System.out.println(teacher2.getName()+teacher2.getAge());
}
}
多线程
Thread()
public class MyThread extends Thread{
private static int ticketNum = 50;
private String lock = "lock";
public MyThread() {
}
public MyThread(String name) {
super(name);
}
@Override
public void run() {
while (ticketNum>0) {
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(lock){//线程锁
System.out.println(this.getName()+"卖出第"+(ticketNum--)+"张票");
}
}
}
}
public static void main(String[] args) {
new MyThread("张三").start();
new MyThread("李四").start();
new MyThread("王五").start();
new MyThread("赵六").start();
}
运行结果:
runnable方式
public class Myrunnable implements Runnable{
private int ticketNum = 50;
private String lock = "lock";
public void run() {
while (ticketNum>0) {
while (ticketNum>0) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//运行结果的最后会出现卖出负数张票,是因为当ticketNum=0时,还有线程还在线程锁处等候,直至它们全部执行完,倒置票数仍在减少
synchronized(lock){
System.out.println(Thread.currentThread().getName()+"卖出第"+(ticketNum--)+"张票");
}
}
}
}
}
setPriority()与join两种方法
概述:
public final void join()
throws InterruptedException等待该线程终止。
抛出:
InterruptedException - 如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除
若带参数:
等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。
参数:
millis - 以毫秒为单位的等待时间。
nanos - 要等待的 0-999999 附加纳秒
new MyThread("张三").start();
Myrunnable myrunnable = new Myrunnable();
Thread t1 = new Thread(myrunnable,"张三");
Thread t2 = new Thread(myrunnable,"李四");
Thread t3 = new Thread(myrunnable,"王五");
Thread t4 = new Thread(myrunnable,"赵六");
t1.start();
t2.setPriority(10);//setPriority()方法用于设置优先级,参数越大优先级越高,优先级范围:1~10
try {
t1.join();//join()是指知道调用该方法的线程执行完再往下执行主线程,如果里面带参数,则是指执行多少毫秒后再往下执行
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("运行结束");
死锁的写法
public class MyRunnable1 implements Runnable{
private String key1 = "key1";
private String key2 = "key2";
@Override
public void run() {
synchronized (key1) {
System.out.println(Thread.currentThread().getName()+"进了room1,持有第一把钥匙");
try {
System.out.println(Thread.currentThread().getName()+"要睡觉了");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"醒了,他需要第二把钥匙");
synchronized(key2){
System.out.println(Thread.currentThread().getName()+"进了room2,持有第二把钥匙");
}
}
}
}
public class MyRunnable2 implements Runnable{
private String key1 = "key1";
private String key2 = "key2";
@Override
public void run() {
synchronized (key2) {
System.out.println(Thread.currentThread().getName()+"进了room2,持有第一把钥匙");
try {
System.out.println(Thread.currentThread().getName()+"要睡觉了");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"醒了,他需要第一把钥匙");
synchronized(key1){
System.out.println(Thread.currentThread().getName()+"进了room1,持有第二把钥匙");
}
}
}
}
public class Test {
public static void main(String[] args) {
MyRunnable1 myRunnable1 = new MyRunnable1();
MyRunnable2 myRunnable2 = new MyRunnable2();
new Thread(myRunnable1, "张三").start();
new Thread(myRunnable2, "李四").start();
}
}
运行结果: