java 反射 内存_Java 反射
Java 反射
正常的類(lèi)加載過(guò)程
當(dāng)執(zhí)行new xxx();語(yǔ)句時(shí),JVM會(huì)被觸發(fā)加載.class文件
JVM從本地文件找到class文件并且加載到內(nèi)存中
JVM自動(dòng)創(chuàng)建一個(gè)class對(duì)象 (一個(gè)類(lèi)只產(chǎn)生一個(gè)class對(duì)象)
將Java的二進(jìn)制代碼合并到JVM的運(yùn)行狀態(tài)之中
驗(yàn)證: 確保類(lèi)的信息符合JVM規(guī)范,沒(méi)有安全問(wèn)題
準(zhǔn)備: 正式為類(lèi)變量分配內(nèi)存并設(shè)置默認(rèn)初始值(都在方法區(qū)進(jìn)行分配)
解析: 虛擬機(jī)常量池內(nèi)的符號(hào)引用(常量名)替換為直接引用(地址)的過(guò)程
初始化
JAVA內(nèi)存分析
堆
存放new的對(duì)象和數(shù)組
可以被所有的線程共享,不會(huì)存放別的對(duì)象引用
棧
存放基本變量類(lèi)型
引用對(duì)象的變量
方法區(qū)
可以被所有的線程共享
包含了所有的class和static變量
類(lèi)加載
PS: 這里僅僅是大概、其中省略了某些步驟
加載
將類(lèi)中的靜態(tài)變量、方法等重新構(gòu)建成一個(gè)新的數(shù)據(jù)結(jié)構(gòu)
生成Class對(duì)象
驗(yàn)證
分配內(nèi)存
為類(lèi)變量分配內(nèi)存,設(shè)置初始值,在方法區(qū)中進(jìn)行分配
解析
將變量替換成直接引用
初始化
執(zhí)行 方法:編譯器按照順序,依次收集類(lèi)變量的賦值語(yǔ)句以及static塊中的語(yǔ)句整合產(chǎn)生
public class Test04 {
public static void main(String[] args) {
A a = new A();
System.out.println(A.m);
}
}
class A {
static {
System.out.println("A -- static");
m = 100;
}
static int m = 200;
public A() {
System.out.println("A -- construct");
}
}
// A -- static
// A -- construct
// 200
public class Test04 {
public static void main(String[] args) {
A a = new A();
System.out.println(A.m);
}
}
class A {
static int m = 200;
static {
System.out.println("A -- static");
m = 100;
}
public A() {
System.out.println("A -- construct");
}
}
// A -- static
// A -- construct
// 100
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
在運(yùn)行時(shí)獲得類(lèi)的各種內(nèi)容,進(jìn)行反編譯,代碼可以在運(yùn)行時(shí)裝配
缺點(diǎn):
消耗資源
安全問(wèn)題
反射本質(zhì)
得到class對(duì)象,反向獲取實(shí)體對(duì)象的各種信息
反射機(jī)制
將類(lèi)的各個(gè)組成部分封裝成其他對(duì)象
優(yōu)點(diǎn)
可以在程序運(yùn)行過(guò)程中操作這些對(duì)象、
解耦
獲取Class對(duì)象的方式
Class.forName("全類(lèi)名");// 將字節(jié)碼文件加載到內(nèi)存,返回Class對(duì)象多用于配置文件
類(lèi)名.class // 通過(guò)類(lèi)名屬性class獲取 多用于參數(shù)傳遞
對(duì)象.getClass() // Object中定義了方法 多用于對(duì)象的獲取字節(jié)碼方式
package reflection;
import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
import java.security.PublicKey;
public class Test02 {
public static void main(String[] args) throws ClassNotFoundException {
Person person = new Student(); // 所對(duì)應(yīng)的Class是Person而非Student
Student student = new Student();
Teacher teacher = new Teacher();
System.out.println("This is " + person.name);
// 通過(guò)對(duì)象獲得
Class c1 = person.getClass();
// forname
Class c2 = Class.forName("reflection.Student");
// 通過(guò)類(lèi)名.class
Class c3 = Student.class;
// 基本內(nèi)置類(lèi)型的包裝類(lèi)有一個(gè)Type屬性
Class c4 = Integer.TYPE;
System.out.println(c1.hashCode());
System.out.println(c2.hashCode());
System.out.println(c3.hashCode());
System.out.println(c4.hashCode());
// 獲取父類(lèi)類(lèi)型
Class c5 = c1.getSuperclass();
System.out.println(c5);
Class c6 = teacher.getClass();
Class c7 = student.getClass();
System.out.println("teacher " + c6);
System.out.println("teacher hash " + c6.hashCode());
System.out.println("teacher super hash " + c6.getSuperclass().hashCode());
System.out.println("student hash " + c7.hashCode());
System.out.println("student super hash " + c7.getSuperclass().hashCode());
}
}
class Person {
public String name;
public Person(String name) {
this.name = name;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
class Student extends Person {
public Student() {
this.name = "Student";
}
}
class Teacher extends Person {
public Teacher() {
this.name = "Teacher";
}
}
使用Class對(duì)象
獲取屬性
獲取成員變量
獲取構(gòu)造方法
public Constructor>[] getConstructors()// 獲取所有的Public構(gòu)造方法
public Constructor>[] getDeclaredConstructors()// 獲取所有的構(gòu)造方法(所 有 !)
public Constructor getConstructor(Class>... parameterTypes)//獲取單個(gè)共有的構(gòu)造方法
public Constructor getDeclaredConstructor(Class... parameterTypes)//獲取某個(gè)構(gòu)造方法(任意)
獲取成員方法
獲取類(lèi)名
用反射機(jī)制創(chuàng)建實(shí)例
用Class對(duì)象的newInstance
Class c = String.class;
Object str = c.newInstance();
str += "123456";
System.out.println(str);
獲取Constructor,通過(guò)Constructor創(chuàng)建實(shí)例
// Person.java(Person類(lèi))
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 創(chuàng)建實(shí)例 Test.java (主類(lèi))
// 獲取Class對(duì)象
Class> p = Person.class;
// 通過(guò)獲取的Class對(duì)象獲取Constructor對(duì)象 (其中里面依次填入的是參數(shù)類(lèi)型)
Constructor> constructor = p.getConstructor(String.class, int.class);
// 根據(jù)Constructor創(chuàng)建實(shí)例
Object person = constructor.newInstance("szx", 19);
System.out.println(person);
總結(jié)
以上是生活随笔為你收集整理的java 反射 内存_Java 反射的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: cad连接不同线段的端点_CAD绘图中两
- 下一篇: 样机模型尺寸怎么改_土耳其五代机全尺寸样