注解
package com.Annotation2.android;
import java.lang.reflect.Field;
public class Clazz {
@TeacherAnnotation(age=20,name="张三" )
private Teacher javaTeacher;
@TeacherAnnotation(age=20,name="李四")
private Teacher englishteacher;
@TeacherAnnotation(age=20,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 {
//将这个teacher对象辅助给此班级对象的该属性
field.set(this, teacher);
//this指的是Student的对象
//将Student的对象的属性值修改为i
} catch (IllegalArgumentException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
field.setAccessible(false);
}
}
}
}
***********************************************************
package com.Annotation2.android;
import com.reflect.android.Person;
public class Teacher extends Person{
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;
}
private String name ;
private int age ;
}
**************************************************************
package com.Annotation2.android;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TeacherAnnotation {
int age() default 19 ;//如果在get中注解中没有声明则使用默认值
String name();
}
反射
工厂方法模式
package com.reflect.android;
public class Person {
public void sleep(){
System.out.println("人睡觉");
}
}
*************************************************************
package com.reflect.android;
public class Student extends Person {
@Override
public void sleep() {
System.out.println("学生睡觉");
}
}
***************************************************************
package com.reflect.android;
public class Teacher extends Person{
@Override
public void sleep() {
System.out.println("老师睡觉");
}
}
************************************************************
package com.reflect.android;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
public class Factory {
public static Person creatPerson() {
Person person = null;
Properties p = new Properties();
//Properties() 创建一个无默认值的空属性列表。
//Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串
try {// void load(InputStream inStream) 从输入流中读取属性列表(键和元素对)
p.load(new FileInputStream("config.properties"));
// String getProperty(String key) 用指定的键在此属性列表中搜索属性。
String clazzName = p.getProperty("person");//Teacher
//forName(String className) 返回与带有给定字符串名的类或接口相关联的 Class 对象
Class clazz = Class.forName(clazzName);//Teacher.class
//newInstance() 创建此 Class 对象所表示的类的一个新实例
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;
}
}
******************************************
package com.reflect.android;
public class FactoryTest {
public static void main(String[] args) {
Person person=Factory.creatPerson();
person.sleep();
}
}
多线程
1继承thread
构造方法Thread(String name) 分配新的 Thread 对象。
String 类型 getName() 返回该线程的名称。
package com.thread.android;
public class ThreadTest extends Thread{
public ThreadTest(){//无参构造器
}
public ThreadTest(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();
}
}
}
}
---------------------------------------------------------
package com.thread.android;
public class TrdTest {
public static void main(String[] args) {
ThreadTest t1=new ThreadTest("售票员1");
//Thread有个有参构造方法可以添加名字
ThreadTest t2=new ThreadTest("售票员2");
ThreadTest t3=new ThreadTest("售票员3");
ThreadTest t4=new ThreadTest("售票员4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
2
1- 实现接口Runnable 只有run方法
2- Thread.currentThread().getName()通过线程的当前线程方法获得线程再通过getName()方法得到线程名字
package com.thread.android;
public class RunnableImpl implements Runnable{
int i=100;
private String s="aas";
@Override
public void run() {
while(i>0){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//线程锁
synchronized (s) {
//四个线程都在等待
//线程1进去后i变为0进不入循环,但是还有三个线程在循环内部等,
if(i>0){
System.out.println(Thread.currentThread().getName()+"卖出的票号码是"+i);
i--;
}
}
}
}
}
-------------------------------------------------------
package com.thread.android;
public class Test {
public static void main(String[] args) {
RunnableImpl rb=new RunnableImpl() ;
Thread td1=new Thread(rb, "售票员1");
Thread td2=new Thread(rb, "售票员2");
Thread td3=new Thread(rb, "售票员3");
Thread td4=new Thread(rb, "售票员4");
td1.start();
td2.start();
td3.start();
td4.start();
}
}
join
td1.start();
// td2.start();
// td3.start();
// td4.start();
try {
//td1.join();//必须等待该线程终止再往下运行
td1.join(1000);//先运行1 秒 然后再往下
System.out.println("运行结束");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
死锁
package com.thread1.android;
public class MyRunnable1 implements Runnable{
private String lock1="1230";
private String lock2="1224";
@Override
public void run() {
synchronized (lock1){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我在等待lock2");
}
synchronized (lock2) {
}
}
}
------------------------------------------------
package com.thread1.android;
public class MyRunnable2 implements Runnable{
private String lock1="1230";
private String lock2="1224";
@Override
public void run() {
synchronized (lock2){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我在等待lock1");
}
synchronized (lock1) {
}
}
}
----------------------------------------------------------
package com.thread1.android;
public class Test {
public static void main(String[] args) {
MyRunnable1 r1=new MyRunnable1();
MyRunnable2 r2=new MyRunnable2();
Thread t1=new Thread(r1,"张丹");
Thread t2=new Thread(r2,"李四");
t1.start();
t2.start();
}
}