日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java基础10(反射)

發布時間:2024/7/5 java 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java基础10(反射) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Java基礎10(反射)

1 什么是反射

官方解釋:反射(reflection)技術通常被用來檢測和改變應用程序在 Java 虛擬機中的行為表現。它是一個相對而言比較高級的技術,反射是一種強有力的技術特性,因此可以使得應用程序突破一些藩籬,執行一些常規手段無法企及的目的。通俗理解就是:反射是一種非常規手段,能在程序運行時修改程序的行為,使用有風險,需謹慎。反射可以被視為動態語言,反射機制允許程序再執行期間借助反射的API來獲取任意類的內部信息。

反射的功能:①在運行時判斷對象所屬類②在運行時通過構造器獲取對象的實例③在運行時獲取類的成員變量(屬性),方法等④通過反射獲取類中的成員屬性,方法。

反射涉及要的一些類

描述

? ? ? ? ?java.lang.Class

反射的源頭,Class類的實例表示正在運行的java應用程序的類和接口

? ? ? java.lang.reflect.Field

提供有關類或接口的屬性信息及動態范圍權限,可以理解為封裝了反射類屬性的類

? ? java.lang.reflect.Method

提供有關類或接口的單獨某個方法的信息

java.lang.reflect.Constructor

提供類的單個構造方法的信息以及他的訪問權限

2 理解Class類,實例化Class類實例

Class類是反射的源頭。注意要和類的概念區分開來,Class類是一個實實在在的類,在?java.lang下有個Class.java的文件和我們自己定義的類一樣,Class對象就是這個類的實例。Class類是繼承了Object的特殊類,他的內部可以記錄類的成員,接口等信息,可以理解為Class是一個用來表示類的類。

java是運行在JVM上的,我們寫好的類經過編譯器編譯后會生成.class文件。在運行期間,當我們要實例化一個類時,會先在內存中查看是否存在這個類,存在的話就直接創建類實例,如果沒有的話就會就會去加載這個類,當加載一個類或者類加載器的defineClass()被JVM調用,便會為這個類產生一個class對象(一個Class類的實例),用來表示這個類,該類所有實例都共同擁有這個Class對象,而且是唯一的。

在java中,類是用來描述信息的,寫明了有哪些內部的屬性及接口,相當于定義了一套規則。Class對象被用來對類的情況進行表述的一個實例,類的實例表征,可以理解為對類的圖形化,這樣JVM才看的懂,看做模板。類的實例化對象,就是通過模版,開辟出的一塊內存進行實際的使用。

創建Class類實例:

(1)調用運行時類本身的.class屬性。如Class clazz?= String.class

(2)通過運行時類的對象。如:Person p = new Person(); Class c = p.getClass();

(3)通過Class類的靜態方法forName(String className)。 如:?Class.forName(“包名.類名”)

(4)通過JVM類加載器。如:ClassLoader c = this.getClass().getClassLoader(); Class clazz = c.getClass();

Object中有個getClass()方法獲得運行時類。

3 運行時創建類(Class)的對象,并獲得類的完整結構

public class TestReflect {@Testpublic void test() throws Exception {Class clazz = Class.forName("month201906.day13.Person");Person p = (Person) clazz.newInstance();// 獲得包名Package package1 = clazz.getPackage();String packName = package1.getName();System.out.println(packName);// 獲得類名System.out.println(clazz.getSimpleName());// 獲得屬性名及其權限修飾符Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {System.out.println(Modifier.toString(field.getModifiers()) + "---" + field.getName());}// 獲得方法名及其權限修飾符Method[] methods = clazz.getDeclaredMethods();for (Method method : methods) {System.out.println(Modifier.toString(method.getModifiers()) + "---" + method.getName());}// 獲得父類System.out.println(clazz.getSuperclass());// 獲得注解Annotation[] annotations = clazz.getAnnotations();for (Annotation annotation : annotations) {System.out.println(annotation);}// 獲取接口Class[] interfaces = clazz.getInterfaces();for (Class inter : interfaces) {System.out.println(inter);}} }@Target({ TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE }) @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation {String name() default "zhujie"; }class Work {String worker;public void doWorker() {System.out.println("工作");} }@MyAnnotation(name = "注解") class Person extends Work implements Serializable {public String name;int age;private String gender;protected int score;public Person() {System.out.println("無參構造");}public Person(String name, int age) {this.name = name;this.age = age;}public Person(String name, int age, String gender, int score) {this.name = name;this.age = age;this.gender = gender;this.score = score;}private String Method1(String name, int age, String gender, int score) {this.name = name;this.age = age;this.gender = gender;this.score = score;return name;}public String Method2() {return "Person [name=" + name + ", age=" + age + ", gender=" + gender + ", score=" + score + "]";}public static void Method3() {System.out.println("Method3 static");}private void Method4() {System.out.println("Method4 private");}protected void Method5() {System.out.println("Method5 protected");}void Method6() {System.out.println("Method6 null");}public void Method7() {System.out.println("Method6 public");}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + ", gender=" + gender + ", score=" + score + "]";}}

?

4 通過反射獲取類的指定屬性、方法、構造器

public class TestReflect {@Testpublic void test1() throws Exception{Class clazz = Class.forName("month201906.day13.Person");Person p = (Person) clazz.newInstance();//獲取指定構造器System.out.println(clazz.getDeclaredConstructor());//有參構造Constructor<Person> con = clazz.getDeclaredConstructor(String.class,int.class,String.class,int.class);Person newInstance = con.newInstance("小明",18,"男",1000);System.out.println(newInstance);//獲取指定屬性Field name = clazz.getDeclaredField("name");//調用屬性name.set(p, "小紅");System.out.println(p);Field gender = clazz.getDeclaredField("gender");gender.setAccessible(true);gender.set(p, "女");System.out.println(p);//獲取指定方法Method method1 = clazz.getDeclaredMethod("Method1", String.class,int.class,String.class,int.class);//調用方法method1.setAccessible(true);method1.invoke(p, "張三",20,"男",5000);System.out.println(p);//調用方法Method method4 = clazz.getDeclaredMethod("Method4");method4.setAccessible(true);method4.invoke(p);}}

5 動態代理

public class TestDynamicProxy {public static void main(String[] args) {RealMothod1 real = new RealMothod1();MyInvocationHandler inv1 = new MyInvocationHandler(real);// 獲取代理對象pubMothod1 obj = (pubMothod1) inv1.getObj();obj.action();RealMothod2 r = new RealMothod2();MyInvocationHandler inv2 = new MyInvocationHandler(r);// 獲取代理對象pubMothod2 pub = (pubMothod2) inv2.getObj();pub.show();} }// 公共方法 interface pubMothod1 {void action(); }interface pubMothod2 {void show(); }// 被代理類1 class RealMothod1 implements pubMothod1 {@Overridepublic void action() {System.out.println("被代理類1號");}}// 被代理類2 class RealMothod2 implements pubMothod2 {@Overridepublic void show() {System.out.println("被代理類2號");} }// 代理類的處理類 1.創建代理對象 ,2.調用代理對象代理的方法 class MyInvocationHandler implements InvocationHandler {// 被代理類的對象的聲明,代理被代理類的對象Object obj; // 給被代理對象 初始化public MyInvocationHandler(Object obj) {this.obj = obj;}// 代理對象 ,代理對象調用重寫的那個方法,自動調用invokepublic Object getObj() {return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("我是invoke");// 反射 "被"代理對象的方法Object object = method.invoke(obj, args);return object;}}

?

總結

以上是生活随笔為你收集整理的Java基础10(反射)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。