08-04 工厂设计模式 反射 线程 注解
2015-08-04 14:41
363 查看
工厂设计模式
反射
线程
注解
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()); } }
相关文章推荐
- linux之cp/scp命令+scp命令详解
- P2P借款的几种情况
- Swift学习笔记系列——(14)析构
- 字符串数组和字符串指针在进行字符串操作时的区别
- SSO (单点登录)实现方式
- vs2005快捷键
- P2P借款的几种情况
- CoreLocation地理编码
- maven小记
- Jackson
- 【java基础增强】增强for循环取Map值
- .bat文件中set和setlocal的用法
- VBA实现outlook自动发信 2
- FreeRTOS 学习笔记 5 —— 调度算法.简述
- socket 10106 解决方法
- 程序员学炒股(3) 个股和大盘的关系之二
- mongodb操作
- 从jsTree演示代码中提取的在线文件查看
- Windows和Linux双系统修改默认启动项、超时时间
- 《谁说菜鸟不会数据分析》 学习笔记二 缺失数据处理