JAVA語言基礎-反射、特性

  • Reflect反射

Bean:Person類

package com.heima.bean;

public class Person {
	private String name;
	private int age;
	public Person() {
		super();
		
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = 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;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (this.getClass() != obj.getClass())		//判斷調用對象和傳入對象的字節碼文件是不是同一個字節碼文件
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	
	public void eat() {
		System.out.println("今天吃了一頓金錢豹");
	}
	
	public void eat(int num) {
		System.out.println("今天吃了" + num + "頓金錢豹");
	}
}

Reflect 1

package com.heima.reflect;

import com.heima.bean.Person;

public class Demo1_Reflect {

	/**
	 * @param args
	 * @throws ClassNotFoundException 
	 */
	public static void main(String[] args) throws ClassNotFoundException {
		Class clazz1 = Class.forName("com.heima.bean.Person");
		Class clazz2 = Person.class;
		
		Person p = new Person();
		Class clazz3 = p.getClass();
		
		System.out.println(clazz1 == clazz2);
		System.out.println(clazz2 == clazz3);
	}

}

Reflect 2

package com.heima.reflect;

import java.io.BufferedReader;
import java.io.FileReader;

public class Demo2_Reflect {

	/**
	 * * 榨汁機(Juicer)榨汁的案例
	 * 分別有水果(Fruit)蘋果(Apple)香蕉(Banana)桔子(Orange)榨汁(squeeze)
	 * @throws IOException 
	 */
	public static void main(String[] args) throws Exception {
		Juicer j = new Juicer();									//建立榨汁機
		//j.run(new Apple());
		//j.run(new Orange());
		BufferedReader br = new BufferedReader(new FileReader("config.properties"));
		Class clazz = Class.forName(br.readLine());					//獲取該類的字節碼文件
		Fruit f = (Fruit) clazz.newInstance();						//建立實例對象
		j.run(f);
		
	}
}
interface Fruit {
	public void squeeze();
}
class Apple implements Fruit {
	public void squeeze() {
		System.out.println("榨出一杯蘋果汁兒");
	}
}

class Orange implements Fruit {
	public void squeeze() {
		System.out.println("榨出一杯橘子汁兒");
	}
}

class Juicer {
	/*public void run(Apple a) {
		a.squeeze();
	}
	
	public void run(Orange o) {
		o.squeeze();
	}*/
	
	public void run(Fruit f) {
		f.squeeze();
	}
}

Constructor

package com.heima.reflect;

import java.lang.reflect.Constructor;

import com.heima.bean.Person;

public class Demo3_Constructor {

	/**
	 * Class類的newInstance()方法是使用該類無參的構造函數建立對象, 若是一個類沒有無參的構造函數,
	 * 就不能這樣建立了,能夠調用Class類的getConstructor
	 * (String.class,int.class)方法獲取一個指定的構造函數而後再調用Constructor類的newInstance
	 * ("張三",20)方法建立對象
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		Class clazz = Class.forName("com.heima.bean.Person");
		//Person p = (Person) clazz.newInstance();				經過無餐構造建立對象
		//System.out.println(p);
		Constructor c = clazz.getConstructor(String.class,int.class);	//獲取有參構造
		Person p = (Person) c.newInstance("張三",23);						//經過有參構造建立對象
		System.out.println(p);
	}

}

Field

package com.heima.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

import com.heima.bean.Person;

public class Demo4_Field {

	/**
	 * Class.getField(String)方法能夠獲取類中的指定字段(可見的),
	 * 若是是私有的能夠用getDeclaedField("name")方法獲取,經過set(obj, "李四")方法能夠設置指定對象上該字段的值,
	 * 若是是私有的須要先調用setAccessible(true)設置訪問權限,用獲取的指定的字段調用get(obj)能夠獲取指定對象中該字段的值
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		Class clazz = Class.forName("com.heima.bean.Person");
		Constructor c = clazz.getConstructor(String.class,int.class);	//獲取有參構造
		Person p = (Person) c.newInstance("張三",23);						//經過有參構造建立對象
		
		//Field f = clazz.getField("name");								//獲取姓名字段
		//f.set(p, "李四");												//修改姓名的值
		Field f = clazz.getDeclaredField("name");						//暴力反射獲取字段
		f.setAccessible(true);											//去除私有權限
		f.set(p, "李四");	
		
		System.out.println(p);
	}

}

Method

package com.heima.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

import com.heima.bean.Person;

public class Demo5_Method {

	/**
	 * Class.getMethod(String, Class...) 和 Class.getDeclaredMethod(String,
	 * Class...)方法能夠獲取類中的指定方法,調用invoke(Object,
	 * Object...)能夠調用該方法,Class.getMethod("eat") invoke(obj)
	 * Class.getMethod("eat",int.class) invoke(obj,10)
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		Class clazz = Class.forName("com.heima.bean.Person");
		Constructor c = clazz.getConstructor(String.class,int.class);	//獲取有參構造
		Person p = (Person) c.newInstance("張三",23);						//經過有參構造建立對象
		
		Method m = clazz.getMethod("eat");								//獲取eat方法
		m.invoke(p);
		
		Method m2 = clazz.getMethod("eat", int.class);					//獲取有參的eat方法
		m2.invoke(p, 10);
	}

}
  • 動態代理

    Studentjava

package com.heima.動態代理;

public interface Student {
	public void login();
	
	public void submit();
}

   StudentImpl設計模式

package com.heima.動態代理;

public class StudentImp implements Student {

	@Override
	public void login() {
		System.out.println("登陸");
	}

	@Override
	public void submit() {
		System.out.println("提交");
	}

}

Useride

package com.heima.動態代理;

public interface User {
	public void add();
	
	public void delete();
}

UserImpl函數

package com.heima.動態代理;

public class UserImp implements User {

	@Override
	public void add() {
		//System.out.println("權限校驗");
		System.out.println("添加功能");
		//System.out.println("日誌記錄");
	}

	@Override
	public void delete() {
		//System.out.println("權限校驗");
		System.out.println("刪除功能");
		//System.out.println("日誌記錄");
	}

}

動態代理 ui

package com.heima.動態代理;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class MyInvocationHandler implements InvocationHandler {
	private Object target;
	
	public MyInvocationHandler(Object target) {
		this.target = target;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("權限校驗");
		method.invoke(target, args);					//執行被代理target對象的方法
		System.out.println("日誌記錄");
		return null;
	}

}

Testthis

package com.heima.動態代理;

import java.lang.reflect.Proxy;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		/*UserImp ui = new UserImp();
		ui.add();
		ui.delete();
		
		System.out.println("-------------------------------");*/
		/*
		 * public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,
		 * InvocationHandler h)
		 */
		/*MyInvocationHandler m = new MyInvocationHandler(ui);
		User u = (User)Proxy.newProxyInstance(ui.getClass().getClassLoader(), ui.getClass().getInterfaces(), m);
		u.add();
		u.delete();*/
		
		StudentImp si = new StudentImp();
		si.login();
		si.submit();
		
		System.out.println("-------------------------------");
		MyInvocationHandler m = new MyInvocationHandler(si);
		Student s = (Student)Proxy.newProxyInstance(si.getClass().getClassLoader(), si.getClass().getInterfaces(), m);
		
		s.login();
		s.submit();
	}

}
  • Enum:枚舉

    Enum

    

package com.heima.枚舉;

public class Demo1_Enum {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//demo1();
		//demo2();
		Week3 mon = Week3.MON;
		mon.show();
	}

	public static void demo2() {
		Week2 mon = Week2.MON;
		System.out.println(mon.getName());
	}

	public static void demo1() {
		Week mon = Week.MON;
		Week tue = Week.TUE;
		Week wed = Week.WED;
		
		System.out.println(mon);
	}

}

Weekspa

package com.heima.枚舉;

public class Week {
	
	public static final Week MON = new Week();
	public static final Week TUE = new Week();
	public static final Week WED = new Week();
	
	private Week(){}						//私有構造,不讓其餘類建立本類對象
}

 Week2設計

package com.heima.枚舉;

public class Week2 {
	
	public static final Week2 MON = new Week2("星期一");
	public static final Week2 TUE = new Week2("星期二");
	public static final Week2 WED = new Week2("星期三");
	
	private String name;
	private Week2(String name){
		this.name = name;
	}						//私有構造,不讓其餘類建立本類對象
	public String getName() {
		return name;
	}
	
	
}

Week3代理

package com.heima.枚舉;

public abstract class Week3 {
	
	public static final Week3 MON = new Week3("星期一") {
		public void show() {
			System.out.println("星期一");
		}
	};
	public static final Week3 TUE = new Week3("星期二"){
		public void show() {
			System.out.println("星期二");
		}
	};
	public static final Week3 WED = new Week3("星期三"){
		public void show() {
			System.out.println("星期三");
		}
	};
	
	private String name;
	private Week3(String name){
		this.name = name;
	}						//私有構造,不讓其餘類建立本類對象
	public String getName() {
		return name;
	}
	
	public abstract void show();
}
  • Enum 2

    Enum

package com.heima.枚舉2;

public class Demo1_Enum {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//demo1();
		//demo2();
		//demo3();
		Week3 mon = Week3.TUE;
		switch (mon) {
		case MON:
			System.out.println("星期一");
			break;
		case TUE:
			System.out.println("星期二");
			break;
		}
	}

	public static void demo3() {
		Week3 mon = Week3.MON;
		mon.show();
	}

	public static void demo2() {
		Week2 mon = Week2.MON;
		System.out.println(mon.getName());
	}

	public static void demo1() {
		Week mon = Week.MON;
		System.out.println(mon);
	}

}

enum2

package com.heima.枚舉2;

public class Demo2_Enum {

	/**
	 * int ordinal()
	* int compareTo(E o)
	* String name()
	* String toString()
	* <T> T valueOf(Class<T> type,String name)
	* values() 
	* 此方法雖然在JDK文檔中查找不到,但每一個枚舉類都具備該方法,它遍歷枚舉類的全部枚舉值很是方便
	 */
	public static void main(String[] args) {
		//demo1();
//		Week2 mon = Week2.valueOf(Week2.class, "MON");		//經過字節碼對象獲取枚舉項
//		System.out.println(mon);
		
		Week2[] arr = Week2.values();
		for (Week2 week2 : arr) {
			System.out.println(week2);
		}
	}

	public static void demo1() {
		Week2 mon = Week2.MON;
		Week2 tue = Week2.TUE;
		Week2 wed = Week2.WED;
		
		/*System.out.println(mon.ordinal());				//枚舉項都是有編號的
		System.out.println(tue.ordinal());
		System.out.println(wed.ordinal());
		
		System.out.println(mon.compareTo(tue));			//比較的是編號
		System.out.println(mon.compareTo(wed));*/
		
		System.out.println(mon.name()); 				//獲取實例名稱
		System.out.println(mon.toString()); 			//調用重寫以後的toString方法
	}

}

Week

package com.heima.枚舉2;

public enum Week {
	MON,TUE,WED;
}

Week2

package com.heima.枚舉2;

public enum Week2 {
	MON("星期一"),TUE("星期二"),WED("星期三");
	
	private String name;
	private Week2(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	
	public String toString() {
		return name;
	}
}

Week3

package com.heima.枚舉2;

public enum Week3 {
	MON("星期一"){
		public void show() {
			System.out.println("星期一");
		}
	},TUE("星期二"){
		public void show() {
			System.out.println("星期二");
		}
	},WED("星期三"){
		public void show() {
			System.out.println("星期三");
		}
	};
	
	private String name;
	private Week3(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	
	public abstract void show();
	
}
  • 模板方法設計模式    

package com.heima.模版方法設計模式;

public class Demo1_Template {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		/*long start = System.currentTimeMillis();
		for(int i = 0; i < 1000000; i++) {
			System.out.println("x");
		}
		long end = System.currentTimeMillis();
		System.out.println(end - start);*/
		Demo d = new Demo();
		System.out.println(d.getTime());
	}

}

abstract class GetTime {
	public final long getTime() {
		long start = System.currentTimeMillis();
		code();
		long end = System.currentTimeMillis();
		return end - start;
	}

	public abstract void code();
}

class Demo extends GetTime {

	@Override
	public void code() {
		int i = 0;
		while(i < 100000) {
			System.out.println("x");
			i++;
		}
	}
}
  • Test    

package com.heima.test;

public class DemoClass {
	public void run() {
		System.out.println("welcome to heima!");
	}
}

test1 

package com.heima.test;

import java.lang.reflect.Method;
import java.util.ArrayList;

public class Test1 {

	/**
	 * @param args
	 * ArrayList<Integer>的一個對象,在這個集合中添加一個字符串數據,如何實現呢?
	 * 泛型只在編譯期有效,在運行期會被擦除掉
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		ArrayList<Integer> list = new ArrayList<>();
		list.add(111);
		list.add(222);
		
		Class clazz = Class.forName("java.util.ArrayList");				//獲取字節碼對象
		Method m = clazz.getMethod("add", Object.class);				//獲取add方法
		m.invoke(list, "abc");
		
		System.out.println(list);
		
	}

}

test2

package com.heima.test;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;

public class Test2 {

	/**
	 * * 已知一個類,定義以下: 
	 * package cn.itcast.heima;
	 * 		public class DemoClass {
				public void run() {
					System.out.println("welcome to heima!");
				}
			}
	 * (1) 寫一個Properties格式的配置文件,配置類的完整名稱。 
	 * (2) 寫一個程序,讀取這個Properties配置文件,得到類的完整名稱並加載這個類,用反射的方式運行run方法。
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new FileReader("xxx.properties"));	//建立輸入流關聯xxx.properties
		Class clazz = Class.forName(br.readLine());									//讀取配置文件中類名,獲取字節碼對象
		
		DemoClass dc = (DemoClass) clazz.newInstance();								//經過字節碼對象建立對象
		dc.run();
	}

}

test3

package com.heima.test;

public class Test3 {

	/**
	 * * A:案例演示
	* public void setProperty(Object obj, String propertyName, Object value){},
	* 此方法可將obj對象中名爲propertyName的屬性的值設置爲value。
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		Student s = new Student("張三", 23);
		System.out.println(s);
		
		Tool t = new Tool();
		t.setProperty(s, "name", "李四");
		System.out.println(s);
	}

}

class Student {
	private String name;
	private int age;
	public Student() {
		super();
		
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = 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;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
	
}

test4

package com.heima.test;

import java.lang.reflect.Field;

public class Tool {
	//此方法可將obj對象中名爲propertyName的屬性的值設置爲value。
	public void setProperty(Object obj, String propertyName, Object value) throws Exception {
		Class clazz = obj.getClass();					//獲取字節碼對象
		Field f = clazz.getDeclaredField(propertyName);	//暴力反射獲取字段
		f.setAccessible(true);							//去除權限
		f.set(obj, value);
	}
}
  • JDK7新特性    

package com.heima.jdk7;

public class Demo1_JDK7 {

	/**
	 	* A:二進制字面量
		* B:數字字面量能夠出現下劃線
		* C:switch 語句能夠用字符串
		* D:泛型簡化,菱形泛型
		* E:異常的多個catch合併,每一個異經常使用或|
		* F:try-with-resources 語句,1.7版標準的異常處理代碼
		* 
		* 100_000
	 */
	public static void main(String[] args) {
		System.out.println(0b110);
		System.out.println(100_000);
	}

}
相關文章
相關標籤/搜索