JAVA反射机制初步理解
生活随笔
收集整理的這篇文章主要介紹了
JAVA反射机制初步理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Java中我們這樣聲明一個類,如人類
package cn.com.lcx.test;public class Person {public String sex = "男";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;}public void say(){System.out.println("姓名:"+name+",年齡:"+age+","+sex);} }這是一個Person類型,java 類庫中有 String類型,
不管是我們自定義的 類型還是 java類庫中的類型 它們都有 構造函數、成員函數、成員屬性,java中對象是對客觀事物的抽象,類是對對象的抽象,所以java將所有的類型抽象成這樣一個類型:Class類型。
我們用Person 類聲明一個對象,Person p = new Person(); 這代表了一個具體的人類對象。
而我們的Class 類的對象就是具體的類如Person類,或者可以說是 Person類的那份二進制代碼。我們可以通過以下3種方式聲明Class 類的對象
Person person = new Person(); Class personClass1 = Person.class;//類名.class Class personClass2 = person.getClass();//Person類對象的getClass方法 Class personClass3 = Class.forName("cn.com.lcx.test.Person");//類完整路徑這樣我們就獲取到了Person類的代碼,Class 類 api中可以通過如下方法獲取到 Class對象的構造函數、成員函數、成員屬性等類元素的反射對象。
反射對象類,都在java.refect包總定義,主要有以下3個反射類:
Constructor.class:類中構造函數反射類
Method.class:類中方法反射類
Field.class:類的成員屬性反射類
反射類和普通類一樣都是對共有東西的抽象。
普通的方式訪問成員函數或者成員屬性是通過具體的對象去進行訪問,
而反射是方法/屬性對象針對某個具體對象進行調用或者訪問的,這普通的方式好像是反著的,可能這就是反射的由來吧。
下面舉個簡單的例子進行拋磚引玉
package cn.com.lcx.test;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;public class Refect {@SuppressWarnings({ "rawtypes", "unchecked" })public static void main(String[] args) throws Exception {//普通方式:實例化對象、調用方法、訪問屬性Person person = new Person("普通人",0);//構造函數調用person.sex = "男";//訪問屬性person.say();//調用方法Class personClass1 = Person.class;//類名.classClass personClass2 = person.getClass();//Person類對象的getClass方法Class personClass3 = Class.forName("cn.com.lcx.test.Person");//類完整路徑//Person類的構造函數反射類對象Constructor personConstructor = personClass1.getConstructor(String.class,int.class);System.out.println("通過反射實例化對象---------");//通過構造函數反射類對象實例化Person類對象Person person1 =(Person) personConstructor.newInstance("張一",1);Person person2 = (Person) personConstructor.newInstance("張二",2);Person person3 = (Person) personConstructor.newInstance("張三",3);person1.say();person2.say();person3.say();System.out.println("通過反射實現對對象成員方法調用---------");//Person類的成員函數反射類對象Method method = personClass2.getMethod("setName",String.class);method.invoke(person1, "李一");method.invoke(person2, "李二");method.invoke(person3, "李三");person1.say();person2.say();person3.say();System.out.println("通過反射實現對成員屬性的訪問---------");//Person類的成員屬性反射類對象Field field = personClass3.getField("sex");//獲取公有屬性/*** 獲取私有屬性或者私有方法用getDeclaredXXX方法,* 如果想訪問私有成員那么該屬性對象或者方法對象要設置setAccessible(true)方法*/Field fieldPrivate = personClass3.getDeclaredField("name");fieldPrivate.setAccessible(true);//設置可以訪問私有屬性fieldPrivate.set(person, "反射人");person.say();field.set(person1, "男人");field.set(person2, "女人");field.set(person3, "人妖");person1.say();person2.say();person3.say();} }總結
以上是生活随笔為你收集整理的JAVA反射机制初步理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gcc在64位系统上一个史诗级WARNI
- 下一篇: Java内部类详解(Mark)