08-04 工厂设计模式 反射 线程 注解

工厂设计模式

public class Person {
    public void sleep(){
        System.out.println("人睡觉");
    }
}
public class Teacher extends Person{
    @Override
    public void sleep() {
        System.out.println("老师睡觉");     
    }   
}
public class Student extends Person{
    @Override
    public void sleep() {
        System.out.println("学生睡觉");     
    }   
}
  config.properties
     person=com.factory.Teacher

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 (IOException e) {          
            e.printStackTrace();
        } catch (ClassNotFoundException e) {            
            e.printStackTrace();
        } catch (InstantiationException e) {            
            e.printStackTrace();
        } catch (IllegalAccessException e) {            
            e.printStackTrace();
        }
        return person;
    }   
}
public class FactoryTest {
    public static void main(String[] args) {
        Person person=Factory.createPerson();
        person.sleep();
    }
} 

反射

public class Student {
    public String clazz;
    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;
    }
}
public class Test {
    public static void main(String[] args) {
        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().getName());//输出属性类型
            System.out.println(field.getModifiers());//返回属性修饰符的整数表示形式
        }

        Student lisi=new Student();
        try {
            Field age=clazz.getDeclaredField("age");//得到指定的属性名称age
            age.setAccessible(true);//取消java访问修饰符检查
            age.set(lisi, 18);//将对象lisi的age属性设置为18
            age.setAccessible(false);//取消 取消检查
            System.out.println(lisi.getAge());//输出lisi的age
        } catch (NoSuchFieldException e) {          
            e.printStackTrace();
        } catch (SecurityException e) {         
            e.printStackTrace();
        } catch (IllegalArgumentException e) {          
            e.printStackTrace();
        } catch (IllegalAccessException e) {            
            e.printStackTrace();
        }       
    }
}

线程

//**MyThread**
public class MyThread extends Thread{
    public MyThread(){      
    }
    public MyThread(String name){
        super(name);        
    }

    private int ticket=200;

    @Override
    public void run() {
        while(ticket>0){
            System.out.println(getName()+"卖出了第"+ticket+"票");
            ticket--;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
public class Test {
    public static void main(String[] args) {                
        MyThread t1=new MyThread("售票员甲");
        MyThread t2=new MyThread("售票员乙");
        MyThread t3=new MyThread("售票员丙");
        t1.start();
        t2.start();
        t3.start();
    }
}
//**MyRunnable**
public class MyRunable implements Runnable{
    private int i=100;    
    private String s="asd";
    public void run() {
        while(i>0){
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //锁
            synchronized (s) {
                if(i>0){
                    System.out.println(Thread.currentThread().getName()+"卖出了第"+i+"票");
                    i--;
                }               
            }
        }
public class Test {
    public static void main(String[] args) { 
        MyRunable runable=new MyRunable();
        Thread t1=new Thread(runable,"售票员1");
        Thread t2=new Thread(runable,"售票员2");
        Thread t3=new Thread(runable,"售票员3");
        t1.start();
        t2.start();
        t3.start(); 

        //**john() 用法**
//      MyRunable runable=new MyRunable();
//      Thread t1=new Thread(runable,"售票员1");
//      t1.start();
//      try {
//          t1.join(1000);
//          //join()是等待进程结束,join(1000)是等待该线程执行一秒
//      } catch (InterruptedException e) {
//          // TODO Auto-generated catch block
//          e.printStackTrace();
//      }
//      System.out.println("程序进程结束");
    }
}
//**死锁**
public class MyRunable1 implements Runnable{
    String lock1="asd";
    String lock2="qwe";

    @Override
    public void run() {
        synchronized(lock1){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        System.out.println("我在等LOCK2");
        synchronized (lock2) {          
        }       
    }   
}
public class MyRunable2 implements Runnable{
    String lock1="asd";
    String lock2="qwe";

    @Override
    public void run() {
        synchronized(lock2){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        System.out.println("我在等LOCK1");
        synchronized (lock1) {          
        }       
    }
}
public class Test {
    public static void main(String[] args) { 
        MyRunable1 run1=new MyRunable1();
        MyRunable2 run2=new MyRunable2();
        Thread t1=new Thread(run1,"张思");
        Thread t2 =new Thread(run2, "李斯");
        t1.start();
        t2.start(); 
    }
}

注解

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;
    }   
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface TeacherAnnotation {
    int age() default 19;
    String name();
}
public class Clazz {
    @TeacherAnnotation(age=20,name="张三")
    private Teacher javaTeacher;
    @TeacherAnnotation(age=20,name="李斯")
    private Teacher englishTeacher;
    @TeacherAnnotation(name="王武")
    private Teacher mathTeacher;

    private int clazzNum;
    private String name;

    public Clazz(){
        Class clazz=Clazz.class;
        Field[] fields=clazz.getDeclaredFields();
        //得到clazz所有的属性
        for(Field field:fields){
            TeacherAnnotation ta=field.getAnnotation(TeacherAnnotation.class);
            //得到TeacherAnnotation注解,如果没有返回null
            if(ta==null){
                continue;//如果位null跳出
            }else{
                int age=ta.age();//得到该注解的age值,如果没写则赋默认值
                String name=ta.name();//得到该注解的name值
                Teacher teacher=new Teacher();
                teacher.setAge(age);
                teacher.setName(name);//根据注解的值创建新的对象
                field.setAccessible(true);//设置为不检查属性的访问修饰符
                try {
                    field.set(this, teacher);//将这个Teacher对象赋给此班级对象
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }//this指的是Student的对象
                //将Student的对象的age属性值修改为i
                field.setAccessible(false);
            }
        }
    }

    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) {
        Clazz clazz=new Clazz();
        System.out.println(clazz.getEnglishTeacher().getName());
        System.out.println(clazz.getMathTeacher().getAge());
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值