java基礎之反射和泛型以及注解
java基礎之反射和泛型以及注解
泛型擦除
泛型擦除: 泛型只在編譯時期有效,編譯后的字節(jié)碼文件中不存在泛型信息。
聲明泛型集合,集合兩端類型必須一致。類型也可以用包裝類型,泛型的類型必須是引用類型,不能為基本類型。
實現(xiàn)公用的類和方法,對公用的業(yè)務進行抽取。
泛型方法/泛型類/泛型接口
public class GenericTest
{
/**
* 泛型聲明,定義泛型方法
* @param <T>
* @param <K>
* @param t
* @param k
*/
public <T, K> K save(T t, K k)
{
return null;
}
@Test
public void testMethod() throws Exception
{
//使用泛型方法: 在使用泛型方法的時候,確定泛型的類型
save("hello", 1);
}
}
泛型類:
public class GenericTest<T>
@Test
public void testMethod() throws Exception
{
//使用泛型方法: 在使用泛型方法的時候,確定泛型的類型
//save("hello", 1);
//泛型類如何使用:在創(chuàng)建泛型類的時候確定
GenericTest<String> demo = new GenericTest<String>();
demo.save("hello", 1);
}
泛型中的extends 和super的意義:
Extends:定義List<? Extends String>;傳入的參數(shù)?必須是String類型的子類,否則會報錯;
Super:定義List<? Super String>;傳入的參數(shù)必須是String類型的父類,否則會報錯;
Type : 接口,任何類型默認的接口!
反射
反射可以在運行時期動態(tài)創(chuàng)建對象,獲取對象的屬性,方法
/**
* @ClassName: App
* @Description: 反射技術
* @author lqw
* @date 2016-5-13 下午01:33:55
*
*/
public class App
{
@Test
public void testInfo() throws Exception
{
//類全名
String sql = "com.hbmy.reflect.demo2.Admin";
//得到類的字節(jié)碼
Class<?> clazz = Class.forName(sql);
/**
* 創(chuàng)建對象1: 通過默認構造函數(shù)創(chuàng)建(簡寫)
*/
Admin admin = (Admin) clazz.newInstance();
/**
* 創(chuàng)建對象2: 通過無參構造器創(chuàng)建對象
*/
Constructor<?> constructors = clazz.getDeclaredConstructor();
constructors.newInstance();
/**
* 創(chuàng)建對象3:通過有參構造器創(chuàng)建對象
*/
Constructor<?> constructor = clazz.getDeclaredConstructor(String.class);
Admin admin2 = (Admin) constructor.newInstance("zhangsan");
// System.out.println(admin);
}
/**
* 獲取屬性名稱、值
* getDeclaredFields: 獲取所有的包含私有的屬性名稱
* getFields:只能訪問public的屬性
*/
@Test
public void testNameAndValue() throws Exception
{
//類全名
String sql = "com.hbmy.reflect.demo2.Admin";
//得到類的字節(jié)碼
Class<?> clazz = Class.forName(sql);
Admin admin = (Admin) clazz.newInstance();
// Method[] methods = clazz.getMethods();
// for (Method method : methods)
// {
// //設置強制訪問
// method.setAccessible(true);
// //名稱
// String name = method.getName();
// System.out.println(name);
//
// }
// Field[] fields = clazz.getFields();//打印出來的結果只有money
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields)
{
//設置強制訪問
field.setAccessible(true);
//名稱
String name = field.getName();
Object value = field.get(admin);
System.out.println(name + value);
}
}
/**
* 反射獲取方法
*/
@Test
public void testGetMethods() throws Exception
{
//類全名
String sql = "com.hbmy.reflect.demo2.Admin";
//得到類的字節(jié)碼
Class<?> clazz = Class.forName(sql);
Admin admin = (Admin) clazz.newInstance();
/*
* 獲取方法對象
*/
Method declaredMethod = clazz.getDeclaredMethod("getId");
/**
* 調用方法
*/
Object return_value = declaredMethod.invoke(admin);
System.out.println(return_value);
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods)
{
method.setAccessible(true);
String name = method.getName();
System.out.println(name);
}
}
注解
注解的作用
1、 告訴編譯器如何去運行
2、 簡化(取代)配置文件
public class App
{
@Override
public String toString()
{
return super.toString();
}
@SuppressWarnings({"unused","unchecked"})
public void save()
{
List list = null;
}
@Deprecated
public void save1()
{
}
}
自定義注解: 通過自定義注解可以給類,字段,方法加上描述信息。
public @interface Author
{
/**
* 注解屬性
* 1.修飾符為默認或者public
* 2.不能有主體
* 3. 如果注解名稱為value,使用的時候可以省略名稱,直接給值
*/
String name() default "lqw";
//帶默認值得注解
int age() default 23;
String remark();
}
元注解
元注解就是注解的注解
指定注解的可用范圍
@Target({
TYPE,
FIELD,
METHOD,
PARAMETER,
CONSTRUCTOR,
LOCAL_VARIABLE})
注解的生命周期
/**
* 元注解2: 指定注解的生命周期
* RetentionPolicy.SOURCE 只在源碼級別有效
* RetentionPolicy.CLASS 只在類的字節(jié)碼級別有效 默認值
* RetentionPolicy.RUNTIME 只在運行時期有效
*/
@Retention(RetentionPolicy.SOURCE)
最后總結一句:注解和反射其實不難,只要不畏懼,注解其實看看源碼也就那么回事。至于反射嘛??梢赃@么說,無反射,則無框架,幾乎所有的框架都是通過反射實現(xiàn)的。說白了,反射也就是通過加載類的字節(jié)碼去獲取類里面的方法和屬性,其實框架也是這么實現(xiàn)的。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
解決org.springframework.context.ApplicationContextException報錯的
這篇文章主要介紹了解決org.springframework.context.ApplicationContextException報錯的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
詳解SpringMVC中的@RequestMapping注解
這篇文章主要介紹了SpringMVC中@RequestMapping注解,@RequestMapping注解是一個用來處理請求地址映射的注解,可用于映射一個請求或一個方法,可以用在類或方法上,需要的朋友可以參考下2023-07-07
Spring裝配Bean之用Java代碼安裝配置bean詳解
這篇文章主要給大家介紹了關于Spring裝配Bean之用Java代碼安裝配置bean的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧。2017-10-10
JDK21新特性Record?Patterns記錄模式詳解(最新推薦)
這篇文章主要介紹了JDK21新特性Record?Patterns記錄模式詳解,本JEP建立在Pattern?Matching?for?instanceof(JEP?394)的基礎上,該功能已在JDK?16中發(fā)布,它與Pattern?Matching?for?switch(JEP?441)共同演進,需要的朋友可以參考下2023-09-09
Java for循環(huán)和foreach循環(huán)的性能對比分析
這篇文章主要介紹了Java for循環(huán)和foreach循環(huán)的性能對比分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
java反射調用方法NoSuchMethodException的解決方案
這篇文章主要介紹了java反射調用方法NoSuchMethodException的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
Java Swing BoxLayout箱式布局的實現(xiàn)代碼
這篇文章主要介紹了Java Swing BoxLayout箱式布局的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12

