欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

目錄

柚子快報(bào)激活碼778899分享:Java之反射

柚子快報(bào)激活碼778899分享:Java之反射

http://yzkb.51969.com/

目錄

反射

定義

主要用途

反射相關(guān)的類

Class類中【獲得類相關(guān)方法】

Class類中【獲得類中屬性相關(guān)的方法】?

Class類中【獲得類中注解相關(guān)的方法】?

?

Class類中【獲得類中構(gòu)造器相關(guān)的方法】?

Class類中【獲得類中方法相關(guān)的方法】?

獲得Class對(duì)象

代碼示例1

代碼示例2

反射的優(yōu)缺點(diǎn)

反射

定義

Java的反射(re?ection)機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意方法和屬性,既然能拿到那么,我們就可以修改部分類型信息;這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱為java語(yǔ)言的反射(re?ection)機(jī)制。

主要用途

1.動(dòng)態(tài)地創(chuàng)建類的實(shí)例:在運(yùn)行時(shí)根據(jù)類的全限定名創(chuàng)建對(duì)象。 2.檢查類的結(jié)構(gòu):獲取類的成員變量、方法、構(gòu)造器等信息。 3.調(diào)用方法:在運(yùn)行時(shí)動(dòng)態(tài)地調(diào)用對(duì)象的方法。 4.訪問和修改私有字段:即使在類定義中字段是私有的,也可以通過反射來訪問和修改。?

反射相關(guān)的類

類名用途Class類代表類的實(shí)體,在運(yùn)行的Java應(yīng)用程序中表示類和接口Filed類代表類的成員變量/類的屬性Method類代表類的方法Constructor類代表類的構(gòu)造方法

Class類

Class類代表類的實(shí)體,在運(yùn)行的Java應(yīng)用程序中表示類和接口 .

Java文件被編譯后,生成了.class文件,JVM此時(shí)就要去解讀.class文件 ,被編譯后的Java文件.class也被JVM解析為一個(gè)對(duì)象,這個(gè)對(duì)象就是java.lang.Class,這樣當(dāng)程序在運(yùn)行時(shí),每個(gè).class文件就最終變成了Class類對(duì)象的一個(gè)實(shí)例。我們通過Java的反射機(jī)制應(yīng)用到這個(gè)實(shí)例,就可以去獲得甚至去添加改變這個(gè)類的屬性和動(dòng)作,使得這個(gè)類成為一個(gè)動(dòng)態(tài)的類。

Class類中【獲得類相關(guān)方法】

方法用途getClassLoader()獲得類的加載器getDeclaredClasses()返回一個(gè)數(shù)組,數(shù)組中包含該類的所有類和和接口類的對(duì)象(包括私有的)forName(String className)根據(jù)類名返回類的對(duì)象newInstance()創(chuàng)建類的實(shí)例getName()獲得類的完整路徑名字

Class類中【獲得類中屬性相關(guān)的方法】?

方法用途getField(String name)獲得某個(gè)公有的屬性對(duì)象getFields()獲得所有公有的屬性對(duì)象getDeclaredField(String name)獲得某個(gè)屬性對(duì)象getDeclaredFields()獲得所有屬性對(duì)象

Class類中【獲得類中注解相關(guān)的方法】?

方法用途getAnnotation(Class annotationClass)返回該類中與參數(shù)匹配的公有注解對(duì)象getAnnotations()返回該類中所有的公有注解對(duì)象getDeclaredAnnotaion(Class annotationClass)返回該類中與參數(shù)類型匹配的所有注解對(duì)象getDeclaredAnnotations()返回該類所有的注解對(duì)象

Class類中【獲得類中構(gòu)造器相關(guān)的方法】?

方法用途getConstructor(Class... parameterTypes)獲得該類中與參數(shù)類型匹配的公有構(gòu)造方法getConstructors()獲得該類的所有公有構(gòu)造方法getDeclaredConstructor(Class... parameterTypes)獲得該類中與參數(shù)類型匹配的構(gòu)造方法getDeclaredConstructors()獲得該類所有構(gòu)造方法

Class類中【獲得類中方法相關(guān)的方法】?

方法用途getMethod(String name,Class... parameterTypes)獲得該類某個(gè)公有的方法geMethods()獲得該類所有公有的方法getDeclaredMethod(String name,Class... parameterTypes)獲得該類某個(gè)方法getDeclaredMethds()獲得該類所有方法

獲得Class對(duì)象

反射的第一步是獲取代表某個(gè)類的Class對(duì)象。可以通過多種方式獲取Class對(duì)象,最常見的是:

1.使用Class.forName(String className)靜態(tài)方法,如果類名在類的路徑中,則通過該類的全限定名(包括包名)來獲取Class對(duì)象。注意,這種方式會(huì)拋出ClassNotFoundException。 2.使用.class語(yǔ)法,在編譯時(shí)就已經(jīng)確定。 3.調(diào)用對(duì)象的getClass()方法,在運(yùn)行時(shí)確定對(duì)象的實(shí)際類型。

代碼示例1

class Student{

//私有屬性name

private String name = "bit";

//公有屬性age

public int age = 18;

//不帶參數(shù)的構(gòu)造方法

public Student(){

System.out.println("Student()");

}

private Student(String name,int age) {

this.name = name;

this.age = age;

System.out.println("Student(String,name)");

}

private void eat(){

System.out.println("i am eat");

}

public void sleep(){

System.out.println("i am pig");

}

private void function(String str) {

System.out.println(str);

}

@Override

public String toString() {

return "Student{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

}

public class Test {

//Class對(duì)象 只有一個(gè)

public static void main(String[] args) {

Class c1;

try {

c1 = Class.forName("reflectdemo.Student");

} catch (ClassNotFoundException e) {

throw new RuntimeException(e);

}

Class c2;

c2 = Student.class;

Student student = new Student();

Class c3 = student.getClass();

System.out.println(c1.equals(c2));

System.out.println(c1.equals(c3));

System.out.println(c3.equals(c2));

}

}

代碼示例2

class Student{

//私有屬性name

private String name = "bit";

//公有屬性age

public int age = 18;

//不帶參數(shù)的構(gòu)造方法

public Student(){

System.out.println("Student()");

}

private Student(String name,int age) {

this.name = name;

this.age = age;

System.out.println("Student(String,name)");

}

private void eat(){

System.out.println("i am eat");

}

public void sleep(){

System.out.println("i am pig");

}

private void function(String str) {

System.out.println(str);

}

@Override

public String toString() {

return "Student{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

}

public class ReflectDemo {

//如何通過反射 實(shí)例化對(duì)象

public static void reflectNewInstance() {

Class c1;

try {

c1 = Class.forName("reflectdemo.Student");

Student student = (Student) c1.newInstance();

System.out.println(student);

} catch (ClassNotFoundException e) {

throw new RuntimeException(e);

} catch (InstantiationException e) {

throw new RuntimeException(e);

} catch (IllegalAccessException e) {

throw new RuntimeException(e);

}

}

// 反射私有的構(gòu)造方法 屏蔽內(nèi)容為獲得公有的構(gòu)造方法

public static void reflectPrivateConstructor() {

Class c1;

try {

c1 = Class.forName("reflectdemo.Student");

Constructor con =

(Constructor)c1.getDeclaredConstructor(String.class,int.class);

con.setAccessible(true);

Student student = con.newInstance("zhangsan",18);

System.out.println(student);

} catch (ClassNotFoundException e) {

throw new RuntimeException(e);

} catch (NoSuchMethodException e) {

throw new RuntimeException(e);

} catch (InvocationTargetException e) {

throw new RuntimeException(e);

} catch (InstantiationException e) {

throw new RuntimeException(e);

} catch (IllegalAccessException e) {

throw new RuntimeException(e);

}

}

// 反射私有屬性

public static void reflectPrivateField() {

Class c1;

try {

c1 = Class.forName("reflectdemo.Student");

Field field = c1.getDeclaredField("name");

field.setAccessible(true);

Student student = (Student) c1.newInstance();

field.set(student,"wangwu");

System.out.println(student);

} catch (ClassNotFoundException e) {

throw new RuntimeException(e);

} catch (NoSuchFieldException e) {

throw new RuntimeException(e);

} catch (InstantiationException e) {

throw new RuntimeException(e);

} catch (IllegalAccessException e) {

throw new RuntimeException(e);

}

}

// 反射私有方法

public static void reflectPrivateMethod() {

Class c1;

try {

c1 = Class.forName("reflectdemo.Student");

Method method = c1.getDeclaredMethod("function",String.class);

method.setAccessible(true);

Student student = (Student) c1.newInstance();

method.invoke(student,"我是一個(gè)參數(shù)");

//System.out.println(student);

} catch (ClassNotFoundException e) {

throw new RuntimeException(e);

} catch (NoSuchMethodException e) {

throw new RuntimeException(e);

} catch (InstantiationException e) {

throw new RuntimeException(e);

} catch (IllegalAccessException e) {

throw new RuntimeException(e);

} catch (InvocationTargetException e) {

throw new RuntimeException(e);

}

}

public static void main(String[] args) {

//reflectNewInstance();

//reflectPrivateConstructor();

//reflectPrivateField();

reflectPrivateMethod();

}

}

反射的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

1. 對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;

? ? 對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法。

2. 增加程序的靈活性和擴(kuò)展性,降低耦合性,提高自適應(yīng)能力。 3. 反射已經(jīng)運(yùn)用在了很多流行框架如:Struts、Hibernate、Spring 等等。

缺點(diǎn)

1.反射會(huì)破壞封裝性,使代碼難以理解和維護(hù)。 2.反射通常比直接代碼調(diào)用慢,因?yàn)樗婕暗筋愋蜋z查等動(dòng)態(tài)解析。 3.濫用反射可能導(dǎo)致安全問題,如訪問或修改不應(yīng)該被訪問的私有成員。

柚子快報(bào)激活碼778899分享:Java之反射

http://yzkb.51969.com/

相關(guān)閱讀

評(píng)論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19531373.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄