能點開這篇文章,相信你已經準備好了
那就讓我們開始讀代碼吧,我會把對代碼的理解寫入註釋中
這裏我先解釋一下什麼是字節碼對象:
字節碼文件對象包含啥?
類 | 字節文件對象 |
---|---|
構造方法 | 構造方法對象(類型Constructor) |
成員變量 | 成員變量對象(類型Field) |
成員方法 | 成員方法對象(類型Method) |
不要問我爲什麼要讀代碼,我會告訴你,代碼說的比我好,請仔細品嚐,不懂的私信我或者百度,讀代碼開始,
package com.javase.reflect.demo1;
/*
* 0. 在一次程序運行過程中,通過同一個類創建的對象得到的字節碼文件對象是同一個
*/
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p = new Person();
Person p2 = new Person();
//Object getClass()
Class class1 = p.getClass();
Class class2 = p2.getClass();
System.out.println(class1);
System.out.println(class2);
System.out.println(class2 == class1);
//類型.class
//類型:引用數據類型 還可以是基本的數據類型
Class class3 = Person.class;
Class class4 = int.class;
System.out.println(class3 );
//Class.forName("類型名(大名)")
try {
Class class5 = Class.forName("com.javase.reflect.demo1.Person");
System.out.println(class1 == class5);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
總共八個Java文件加一個文本文件
剛剛是第一個,接下來有大招,注意。。。
package com.javase.reflect.demo1;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Test2 {
public static void main(String[] args) throws Exception {
//讀取配置文件中的類的信息
FileReader f = new FileReader("aa.txt");
BufferedReader br = new BufferedReader(f);
String str = br.readLine();
System.out.println(str);
Person p = new Person();
//用字節碼文件對象來創建對象
Class clazz = Class.forName(str);
Constructor[] constructors = clazz.getConstructors();
System.out.println(constructors.length);
System.out.println(constructors[0]);
System.out.println(constructors[1]);
//用構造其對象來創建類的對象
Constructor c =constructors[0];
// System.out.println(c);
Object obj = c.newInstance();
// Person pp = (Person)obj;
// pp.eat();
System.out.println(obj);
}
}
package com.javase.reflect.demo2;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/*
*
* 2. 得到字節碼中的成員變量對象
*/
public class Test3 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
// 1、得到成員變量對象
Class clazz = Class.forName("com.javase.reflect.demo2.Person");
//得到指定的Field Declared
Field name = clazz.getDeclaredField("name");
name.setAccessible(true);
//傳統的屬性調用方式 對象.屬性名 屬性對象.set(對象 ,"value")
Object obj = clazz.newInstance();
name.set(obj, "張三");
System.out.println(obj);
}
}
package com.javase.reflect.demo2;
public class Person {
//構造方法
protected Person() {
// TODO Auto-generated constructor stub
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
Person(String name) {
super();
this.name = name;
}
private Person(int age) {
super();
this.age = age;
}
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 void eat() {
System.out.println("喫飯。。。。");
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
private String method(String namString) {
System.out.println(namString);
return "1231";
}
}
package com.javase.reflect.demo1;
/*
* 0. 在一次程序運行過程中,通過同一個類創建的對象得到的字節碼文件對象是同一個
*/
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p = new Person();
Person p2 = new Person();
//Object getClass()
Class class1 = p.getClass();
Class class2 = p2.getClass();
System.out.println(class1);
System.out.println(class2);
System.out.println(class2 == class1);
//類型.class
//類型:引用數據類型 還可以是基本的數據類型
Class class3 = Person.class;
Class class4 = int.class;
System.out.println(class3 );
//Class.forName("類型名(大名)")
try {
Class class5 = Class.forName("com.javase.reflect.demo1.Person");
System.out.println(class1 == class5);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.javase.reflect.demo1;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Test2 {
public static void main(String[] args) throws Exception {
//讀取配置文件中的類的信息
FileReader f = new FileReader("aa.txt");
BufferedReader br = new BufferedReader(f);
String str = br.readLine();
System.out.println(str);
Person p = new Person();
//用字節碼文件對象來創建對象
Class clazz = Class.forName(str);
Constructor[] constructors = clazz.getConstructors();
System.out.println(constructors.length);
System.out.println(constructors[0]);
System.out.println(constructors[1]);
//用構造其對象來創建類的對象
Constructor c =constructors[0];
// System.out.println(c);
Object obj = c.newInstance();
// Person pp = (Person)obj;
// pp.eat();
System.out.println(obj);
}
}
package com.javase.reflect.demo1;
public class Person {
//構造方法
public Person() {
// TODO Auto-generated constructor stub
}
private String name;
private int age;
public String getName() {
return name;
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat() {
System.out.println("喫飯。。。。");
}
@Override
public String toString() {
return "Person22222222";
}
}
package com.javase.reflect.demo1;
public class Person2 {
//構造方法
public Person2() {
// TODO Auto-generated constructor stub
}
private String name;
private int age;
public String getName() {
return name;
}
public Person2(String name, int age) {
super();
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat() {
System.out.println("喫飯。。。。");
}
@Override
public String toString() {
return "Person22222222";
}
}
學習感悟
作爲一個架構師一定要有知識的廣度和深度。
廣度:你得知道有什麼(比如你連apache的commons工具類們都不熟,還重複造輪子?還沒人家造的好)
深度:你要知道選用重點技術的底層原理以及調優方案