生活随笔
收集整理的這篇文章主要介紹了
注解反射
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
jdk1.8
下載地址
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
下載ecipase
https://www.eclipse.org/downloads/
注解和反射
- Annotation是從JDK5.0開(kāi)始引用的新技術(shù)
- Annotation的作用:
- 不是程序本身,可以對(duì)程序作出解釋
- 可以被其他程序(比如編譯器)讀取
- Annotation的格式:
- 注解是以"@注釋名"在代碼中存在的,還可以添加一些參數(shù)值。
- Annotation在哪里使用?
- 可以附加在package,class,method,fild等上面,相當(dāng)于給他們添加了額外的輔助信息,我們可以通過(guò)反射機(jī)制編程實(shí)現(xiàn)對(duì)這些元素的訪(fǎng)問(wèn)
package cn
.org
.mubai
;import java
.lang
.reflect
.Array
;
import java
.util
.ArrayList
;
import java
.util
.List
;public class Test1 {@Deprecatedpublic static void Test() {System
.out
.println("notRecommended");}public static void main(String
[] args
) {Test();}@SuppressWarnings("all") public static void test2(){List list
=new ArrayList();}
}
@SuppressWarnings:定義在java.lang.SuppressWarnings中,用來(lái)抑制編譯時(shí)的警告信息,
元注解
package cn
.org
.mubai
;import java
.lang
.annotation
.*
;public class Test2 {
}
@Target(value
= {ElementType
.METHOD
, ElementType
.TYPE
})
@Retention(value
= RetentionPolicy
.RUNTIME
)
@Documented
@Inherited
@
interface MyAnnotation {
}
反射機(jī)制
動(dòng)態(tài)語(yǔ)言
- 是一類(lèi)在運(yùn)行時(shí)可以改變其結(jié)構(gòu)的語(yǔ)言:例如新的函數(shù)、對(duì)象、 甚至代碼可以被引進(jìn),已有的函數(shù)可以被刪除或是其他結(jié)構(gòu)上的變化。
- 主要?jiǎng)討B(tài)語(yǔ)言:Object-C、C#、JavaScript、PHP、Python等
靜態(tài)語(yǔ)言
- 與動(dòng)態(tài)語(yǔ)言相對(duì)應(yīng)的,運(yùn)行時(shí)結(jié)構(gòu)不可變得語(yǔ)言就是靜態(tài)語(yǔ)言
- Java不是動(dòng)態(tài)語(yǔ)言,但java可以稱(chēng)之為“準(zhǔn)動(dòng)態(tài)語(yǔ)言”。即java有一定的動(dòng)態(tài)性,我們可以利用反射機(jī)制獲得類(lèi)似動(dòng)態(tài)語(yǔ)言的特性。
Java Reflection
-
Refletion (反射) 是java被視為動(dòng)態(tài)語(yǔ)言的關(guān)鍵,反射機(jī)制允許程序在執(zhí)行期間借助于Reflection API取得任何類(lèi)的內(nèi)部信息,并能直接操作任意對(duì)象的內(nèi)部屬性及方法,
Class c=Class.forName();
-
加載外類(lèi)之后,在堆內(nèi)存的方法區(qū)就產(chǎn)生了一個(gè)Class類(lèi)型的對(duì)象(一個(gè)類(lèi)只有一個(gè)Class對(duì)象),這個(gè)對(duì)象就包含了完整的類(lèi)的結(jié)構(gòu)信息。我們可以通過(guò)這個(gè)對(duì)象看到類(lèi)的結(jié)構(gòu)。這個(gè)對(duì)象就像一面鏡子,透過(guò)這個(gè)鏡子看到類(lèi)的結(jié)構(gòu),所以,我們形象稱(chēng)之為:反射
正常方式:引入需要的“包類(lèi)”名稱(chēng)–》通過(guò)new實(shí)例化–》取得實(shí)例化對(duì)象
反射方式:實(shí)例化對(duì)象–》getClass()方法–》得到完整的“包類(lèi)”名稱(chēng)
反射機(jī)制提供的功能
- 在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類(lèi)
- 在運(yùn)行時(shí)構(gòu)造任意一個(gè)類(lèi)的對(duì)象
- 在運(yùn)行時(shí)判斷任意一個(gè)類(lèi)所屬的成員變量和方法
- 在運(yùn)行時(shí)獲取泛型信息
- 在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的成員變量和方法
- 在運(yùn)行時(shí)處理注解
- 生成動(dòng)態(tài)代理
- 。。。。
package cn.org.mubai;public class Test4 {public static void main(String[] args) throws ClassNotFoundException {
// 通過(guò)反射獲取類(lèi)的class對(duì)象Class c1 = Class.forName("cn.org.mubai.User");System.out.println(c1);Class c2 = Class.forName("cn.org.mubai.User");Class c3 = Class.forName("cn.org.mubai.User");Class c4 = Class.forName("cn.org.mubai.User");// 一個(gè)類(lèi)的內(nèi)存中只有一個(gè)class對(duì)象
// 一個(gè)類(lèi)被加載之后,類(lèi)的整個(gè)結(jié)構(gòu)都會(huì)被封裝在class對(duì)象中System.out.println(c2.hashCode());System.out.println(c3.hashCode());System.out.println(c4.hashCode());}
}class User {private String name;private int age;private int id;public User() {}public User(String name, int age, int id) {this.name = name;this.age = age;this.id = id;}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 int getId() {return id;}public void setId(int id) {this.id = id;}
}
Class類(lèi)
package cn
.org
.mubai
;public class Test5 {public static void main(String
[] args
) throws ClassNotFoundException
{person person
=new student();System
.out
.println(person
.name
);Class
c1 = person
.getClass();System
.out
.println(c1
.hashCode());Class
c2 = Class
.forName("cn.org.mubai.student");System
.out
.println(c2
.hashCode());Class
c3=student
.class;System
.out
.println(c3
.hashCode());Class
c4=Integer
.TYPE
;System
.out
.println(c4
);System
.out
.println(c4
.hashCode());Class
c5=c1
.getSuperclass();System
.out
.println(c5
);}
}
class person{String name
;
}
class student extends person{public student() {this.name
="student";}
}class teacher extends person{public teacher() {this.name
="teacher";}
}
java內(nèi)存分析
package cn
.org
.mubai
;import java
.lang
.reflect
.Constructor
;
import java
.lang
.reflect
.Field
;
import java
.lang
.reflect
.InvocationTargetException
;
import java
.lang
.reflect
.Method
;public class Test7 {public static void main(String
[] args
) throws ClassNotFoundException
, IllegalAccessException
, InstantiationException
, NoSuchMethodException
, InvocationTargetException
, NoSuchFieldException
{
Class
c1 = Class
.forName("cn.org.mubai.User");User user
= (User
) c1
.newInstance();System
.out
.println(user
);Constructor deconstructor
= c1
.getDeclaredConstructor(String
.class, int.class, int.class);User newInstance2
= (User
) deconstructor
.newInstance("白", 1, 1);System
.out
.println(newInstance2
.getName());User newInstance3
= (User
) c1
.newInstance();
Method setName
= c1
.getDeclaredMethod("setName", String
.class);Method setId
= c1
.getDeclaredMethod("setId", int.class);
setName
.invoke(newInstance3
, "mubai");setId
.invoke(newInstance3
, 0001);System
.out
.println(newInstance3
.getName());System
.out
.println(newInstance3
.getId());User newInstance4
= (User
) c1
.newInstance();Field age
= c1
.getDeclaredField("age");age
.setAccessible(true);age
.set(newInstance4
, 18);System
.out
.println(newInstance4
.getAge());}
}
package cn
.org
.mubai
;import java
.lang
.reflect
.InvocationTargetException
;
import java
.lang
.reflect
.Method
;public class Test8 {public static void main(String
[] args
) throws NoSuchMethodException
, IllegalAccessException
, InvocationTargetException
{Test1();Test2();Test3();}public static void Test1(){User user
= new User();long timeMillis1
= System
.currentTimeMillis();for (int i
= 0; i
< 1000000000; i
++) {user
.getName();}long timeMillis2
= System
.currentTimeMillis();System
.out
.println("普通方法調(diào)用"+(timeMillis2
-timeMillis1
)+"ms");}public static void Test2() throws NoSuchMethodException
, InvocationTargetException
, IllegalAccessException
{User user
= new User();Class
c1 = user
.getClass();Method getName
= c1
.getDeclaredMethod("getName", null
);long timeMillis1
= System
.currentTimeMillis();for (int i
= 0; i
< 1000000000; i
++) {getName
.invoke(user
,null
);user
.getName();}long timeMillis2
= System
.currentTimeMillis();System
.out
.println("反射方法調(diào)用"+(timeMillis2
-timeMillis1
)+"ms");}public static void Test3() throws NoSuchMethodException
, InvocationTargetException
, IllegalAccessException
{User user
= new User();Class
c1 = user
.getClass();Method getName
= c1
.getDeclaredMethod("getName", null
);long timeMillis1
= System
.currentTimeMillis();getName
.setAccessible(true);for (int i
= 0; i
< 1000000000; i
++) {getName
.invoke(user
,null
);user
.getName();}long timeMillis2
= System
.currentTimeMillis();System
.out
.println("關(guān)閉檢測(cè)"+(timeMillis2
-timeMillis1
)+"ms");}}
練習(xí)ORM
package cn
.org
.mubai
;import java
.lang
.annotation
.*
;
import java
.lang
.reflect
.Field
;
import java
.lang
.reflect
.Method
;public class Test9 {public static void main(String
[] args
) throws ClassNotFoundException
, NoSuchMethodException
, NoSuchFieldException
{Class
c1 = Class
.forName("cn.org.mubai.student1");
Annotation
[] annotations
= c1
.getAnnotations();for (Annotation annotation
:annotations
){System
.out
.println(annotation
);}
mubai mubai
= (mubai
)c1
.getAnnotation(mubai
.class);String value
= mubai
.value();System
.out
.println(value
);
Field id
= c1
.getDeclaredField("id");Fielmubai fielmubai
= id
.getAnnotation(Fielmubai
.class);System
.out
.println(fielmubai
.columnName());System
.out
.println(fielmubai
.length());System
.out
.println(fielmubai
.type());}
}
@mubai("mubai")
class student1{@Fielmubai(columnName
= "name",type
="int",length
=10)private String name
;@Fielmubai(columnName
= "age",type
="int",length
=10)private int age
;@Fielmubai(columnName
= "id",type
="int",length
=10)private int id
;public student1() {}public student1(String name
, int age
, int id
) {this.name
= name
;this.age
= age
;this.id
= id
;}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 int getId() {return id
;}public void setId(int id
) {this.id
= id
;}
}@Target(ElementType
.TYPE
)
@Retention(RetentionPolicy
.RUNTIME
)
@
interface mubai{String
value();
}@Target(ElementType
.FIELD
)
@Retention(RetentionPolicy
.RUNTIME
)
@
interface Fielmubai{String
columnName();String
type();int length();
}
@cn.org
.mubai
.mubai(value
=mubai
)
mubai
id
10
int
總結(jié)
以上是生活随笔為你收集整理的注解反射的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。