JAVA-基礎(Class對象及反射) 1.(1)什麼是class對象? 首先,java有兩種對象,第一種是實例對象,第二種是Class對象,每一個類運行的類型信息就是用Class對象表示的,每一個對象都有一個到java.lang.Class(用於描述對象的結構)的實例的引用。Class類沒有公共的 ...
JAVA-基礎(Class對象及反射)
1.(1)什麼是class對象?
2.創建一個對象的過程?
我們在編寫完java代碼後會交給javac進行編譯生成.class文件,當我們在某個java代碼中調用這個對象時,java會調用ClassLoader類載入器,將這個class文件載入成為一個Class類對象,這個對象中的成員變數,構造方法,成員方法都是用數組將他們裝起來,(編譯器提示方法代碼大多就是這個原理),然後會創建成為一個實例對象。
3.獲取Class對象的方式?
(1)Class.forName(“全類名”):將位元組碼文件載入進記憶體,返回Class對象。
多用於配置文件,將類名定義在配置文件中,讀取文件,載入類。
(2)類名.class:通過類名的屬性class獲取。
多用於參數的傳遞。
(3)對象.getClass():getclass方法在object類中定義。
多用與對象的獲取位元組碼的方式。
同一個位元組碼文件(*.class)在一次程式運行過程中,只會被載入一次,無論通過哪一種方式獲取的class對象都是一個。
1 package cn; 2 3 import cn.entity.Persion; 4 5 public class calss09 { 6 public static void main(String[] args) throws ClassNotFoundException { 7 Class aClass = Class.forName("cn.entity.Persion"); 8 Class bClass = Persion.class; 9 Persion persion = new Persion(); 10 Class cClass = persion.getClass(); 11 Persion persion1= new Persion(); 12 Class dClass = persion.getClass(); 13 persion1.getClass(); 14 System.out.println(persion==persion1); 15 System.out.println(aClass==bClass); 16 System.out.println(aClass==dClass); 17 System.out.println(aClass==cClass); 18 System.out.println(cClass==dClass); 19 } 20 }View Code
4.Class對象的方法?
1 package cn.entity; 2 3 public class Persion { 4 public String name; 5 private int age; 6 7 public Persion(String name, int age) { 8 this.name = name; 9 this.age = age; 10 } 11 12 public Persion() { 13 } 14 15 public String getName() { 16 return name; 17 } 18 19 public void setName(String name) { 20 this.name = name; 21 } 22 23 public int getAge() { 24 return age; 25 } 26 27 public void setAge(int age) { 28 this.age = age; 29 } 30 31 @Override 32 public String toString() { 33 return "Persion{" + 34 "name='" + name + '\'' + 35 ", age=" + age + 36 '}'; 37 } 38 39 public void eat(){ 40 System.out.println("eat...."); 41 } 42 public void hello(String a){ 43 System.out.println("say"+ a); 44 } 45 }View Code
在反射面前,沒有什麼私有共有之分。
1 package cn; 2 3 import cn.entity.Persion; 4 5 import java.lang.reflect.Field; 6 7 public class calss10 { 8 public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { 9 Class p = Persion.class; 10 Field[] fields = p.getFields(); 11 for (Field file:fields) { 12 System.out.println(file); 13 } 14 System.out.println("-------------------------"); 15 Field field = p.getField("name"); 16 Persion persion = new Persion(); 17 Object name = field.get(persion); 18 System.out.println(name); 19 field.set(persion,"zhangsan"); 20 System.out.println(persion); 21 //獲取所有成員變數,不考慮修飾符 22 Field[] declaredFields = p.getDeclaredFields(); 23 for (Field field1:declaredFields) { 24 System.out.println(field1); 25 } 26 System.out.println("-------------------------"); 27 Field field1 = p.getDeclaredField("age"); 28 field1.setAccessible(true);//暴力反射 29 Persion persion1 =new Persion(); 30 Object o = field1.get(persion1); 31 System.out.println(o); 32 } 33 }View Code
運行結果:
構造方法
1 package cn; 2 3 import cn.entity.Persion; 4 5 import java.lang.reflect.Constructor; 6 import java.lang.reflect.InvocationTargetException; 7 8 public class calss11 { 9 public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { 10 //構造器 11 Class persionClass = Persion.class; 12 Constructor constructor = persionClass.getConstructor(String.class, int.class); 13 System.out.println(constructor); 14 Persion persion = new Persion(); 15 //用構造方法創建一個對象 16 Object asd = constructor.newInstance("asd", 10); 17 System.out.println(asd); 18 //空參構造方法創建對象 19 Object o = persionClass.newInstance(); 20 System.out.println(o); 21 } 22 }View Code
運行結果:
方法:
1 package cn; 2 3 import cn.entity.Persion; 4 5 import java.lang.reflect.InvocationTargetException; 6 import java.lang.reflect.Method; 7 8 public class calss12 { 9 public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { 10 //方法 11 Class<Persion> persionClass = Persion.class; 12 13 Method method = persionClass.getMethod("eat"); 14 Persion persion = new Persion(); 15 //執行方法 16 method.invoke(persion); 17 System.out.println("----------------"); 18 Method hello = persionClass.getMethod("hello", String.class); 19 hello.invoke(persion,"hello"); 20 } 21 }View Code
做一個小反射框架
要求創建任意對象執行任意方法
(1)創建一個pro.properties
className=cn.it.entity.Persion
methodName=eat
(2)創建Persion類
1 package cn.it.entity; 2 3 public class Persion { 4 public String name; 5 private int age; 6 7 public Persion(String name, int age) { 8 this.name = name; 9 this.age = age; 10 } 11 12 public Persion() { 13 } 14 15 public String getName() { 16 return name; 17 } 18 19 public void setName(String name) { 20 this.name = name; 21 } 22 23 public int getAge() { 24 return age; 25 } 26 27 public void setAge(int age) { 28 this.age = age; 29 } 30 31 @Override 32 public String toString() { 33 return "Persion{" + 34 "name='" + name + '\'' + 35 ", age=" + age + 36 '}'; 37 } 38 39 public void eat(){ 40 System.out.println("eat...."); 41 } 42 public void hello(String a){ 43 System.out.println("say"+ a); 44 } 45 }View Code
(3)反射
1 package cn.it.domain; 2 3 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.lang.reflect.InvocationTargetException; 7 import java.lang.reflect.Method; 8 import java.util.Properties; 9 10 public class calss13 { 11 public static void main(String[] args) throws IllegalAccessException, InstantiationException, IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException { 12 //獲取class目錄下的配置文件 13 //載入配置文件,轉化為一個集合 14 Properties properties= new Properties(); 15 ClassLoader classLoader = calss13.class.getClassLoader(); 16 InputStream resourceAsStream = classLoader.getResourceAsStream("cn/it/pro.properties"); 17 properties.load(resourceAsStream); 18 19 String className = properties.getProperty("className"); 20 String methodName = properties.getProperty("methodName"); 21 Class aClass = Class.forName(className); 22 Object o = aClass.newInstance(); 23 Method eat = aClass.getMethod("eat"); 24 eat.invoke(o); 25 26 } 27 }View Code
中間寫因為路徑問題一直空指針,很鬱悶所以把項目樣子發一下