java 反射機(jī)制詳解及實例代碼
更新時間:2016年11月02日 10:45:18 投稿:lqh
這篇文章主要介紹了java 反射機(jī)制詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
java 反射機(jī)制:
測試實體類
以Human為例
/**
* Project: Day12_for_lxy
* Created: Lulu
* Date: 2016/8/10
*/
public class Human<T> {
private String name;
private int age;
private float height;
private static int legs = 2;
private Map<String, String> jobs;
private T t;
public int say() {
System.out.println("I'm" + name);
return 0;
}
private void sleep(Human human) {
System.out.println(name + " sleep with " + human.name);
}
public List<Integer> getList() {
return new ArrayList<>();
}
public Human() {
}
private Human(String name, int age, float height) {
this.name = name;
this.age = age;
this.height = height;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age > 150 || age < 0) {
throw new RuntimeException("age > 150 || age < 0");
}
this.age = age;
}
public float getHeight() {
return height;
}
public void setHeight(float height) {
this.height = height;
}
@Override
public String toString() {
return "Human{" +
"name='" + name + '\'' +
", age=" + age +
", height=" + height +
'}';
}
}
測試獲取構(gòu)造方法
/**
* Project: Day12_for_lxy
* Created: Lulu
* Date: 2016/8/10
*/
/*
獲取構(gòu)造方法
*/
public class TestConstructor {
public static void main(String[] args) {
//得到相應(yīng)的類結(jié)構(gòu), 這是用來描述Human這個類的類
Class<Human> humanClass = Human.class;
try {
//// 這是在知道構(gòu)造方法結(jié)構(gòu)的前提下
// //獲取都明確參數(shù)的構(gòu)造方法, 獲取的是公開的(public)
// Constructor<Human> constructor1 = humanClass.getConstructor(String.class, Integer.TYPE, Float.TYPE);
//
// Human h1 = constructor1.newInstance("小明", 18, 1.85f);
// System.out.println(h1.toString());
//
// //構(gòu)造方法, 修飾符類型
// int modifiers = constructor1.getModifiers();
// if (Modifier.isPublic(modifiers)) {
// System.out.println("是public");
// }
// ////獲取都明確參數(shù)的構(gòu)造方法, 獲取的是聲明的
// Constructor<Human> constructor2 = humanClass.getDeclaredConstructor(String.class, Integer.TYPE, Float.TYPE);
// //設(shè)置可以全部訪問
// constructor2.setAccessible(true);
// //這樣是可以獲取到所有的構(gòu)造方法, 包括私有的
// Human human2 = constructor2.newInstance("zll", 18, 1.80f);
// System.out.println(human2.toString());
//不知道構(gòu)造方法的類結(jié)構(gòu)
Constructor<?>[] constructors = humanClass.getDeclaredConstructors();
for (Constructor<?> c : constructors) {
c.setAccessible(true);
System.out.println(c.getName());
System.out.println("===========================");
//參數(shù)列表
Class<?>[] types = c.getParameterTypes();
for (Class<?> type : types) {
System.out.println(type.getTypeName());
}
//修飾符類型
int modifiers = c.getModifiers();
if (Modifier.isPublic(modifiers)) {
System.out.println("是公開的");
}else if (Modifier.isPrivate(modifiers)){
System.out.println("是私有的");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
測試獲取字段
/**
* Project: Day12_for_lxy
* Created: Lulu
* Date: 2016/8/10
*/
/*
獲取屬性:
屬性包括:( 屬性名 類型 修飾符 泛型 )
父類的屬性
自身的屬性
*/
public class TestField {
public static void main(String[] args) {
Class<Human> humanClass = Human.class;
Field[] fields = humanClass.getDeclaredFields();
for (Field f : fields) {
//屬性名
System.out.print(" 名字: " + f.getName() + " ");
System.out.println();
//類型
System.out.print("類型 :" + f.getType() + " ");
System.out.println();
//修飾符
int modifiers = f.getModifiers();
if (Modifier.isPublic(modifiers)) {
System.out.println("公開的");
} else if (Modifier.isPrivate(modifiers)) {
System.out.println("私有的");
}
}
System.out.println("============================泛型==================================");
try {
//通過類結(jié)構(gòu)獲取jobs屬性
Field jobs = humanClass.getDeclaredField("jobs");
//泛型
ParameterizedType type = (ParameterizedType) jobs.getAnnotatedType().getType();
Type[] types = type.getActualTypeArguments();
for (Type type1 : types) {
System.out.println(type1);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("===================設(shè)置值, 得到值============================");
try {
Human<Object> human = new Human<>();
//非靜態(tài), 你要知道給誰設(shè)置屬性的值
Field nameField = humanClass.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(human, "路新藝");
System.out.println(human.getName());
//靜態(tài)
Field legs = humanClass.getDeclaredField("legs");
int modifiers = legs.getModifiers();
legs.setAccessible(true);
if (Modifier.isStatic(modifiers)) {
System.out.println("是靜態(tài)的");
}
legs.set(null, 4);
System.out.println(legs.get(null));
} catch (Exception e) {
e.printStackTrace();
}
}
}
測試獲取方法
/**
* Project: Day12_for_lxy
* Created: Lulu
* Date: 2016/8/10
*/
/*
獲取方法:
方法名
修飾符
返回值類型
泛型
靜態(tài)和非靜態(tài)
方法的調(diào)用
*/
public class TestMethod {
public static void main(String[] args) {
Class<Human> humanClass = Human.class;
//方法名
Method[] ms = humanClass.getDeclaredMethods();
for (Method m : ms) {
m.setAccessible(true);
System.out.print("方法名: " + m.getName() + " " );
int modifiers = m.getModifiers();
if (Modifier.isPublic(modifiers)) {
System.out.println("公開的");
} else if (Modifier.isPrivate(modifiers)) {
System.out.println("私有的");
}
}
//在確定方法參數(shù)的情況下 方法名不能唯一的確定, 重載
try {
//普通類型
Method sayM = humanClass.getDeclaredMethod("say");
Class<?> returnType = sayM.getReturnType();
System.out.println(returnType.toString());
//泛型
Method getListM = humanClass.getDeclaredMethod("getList");
System.out.println(getListM.getReturnType());
ParameterizedType type = (ParameterizedType) getListM.getAnnotatedReturnType().getType();
System.out.println(type);
Type[] ts = type.getActualTypeArguments();
for (Type t : ts) {
System.out.println(t);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
測試獲取類信息
public static void main(String[] args) {
printClassInfo(Student.class);
}
public static void printClassInfo(Class c){
//Java中唯一的父類的類時Object
System.out.println(c.getName());
System.out.println(c.getSimpleName());
System.out.println(c.getSuperclass());
Class[] interfaces = c.getInterfaces();
for (Class anInterface : interfaces) {
System.out.println(anInterface);
}
//外部類類只有兩種訪問權(quán)限修飾(public 和 default)
int modifiers = c.getModifiers();
}
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
java selenium Selenium IDE介紹及用法
本文主要介紹java selenium Selenium IDE,這里整理了相關(guān)資料和介紹如何安裝 Selenium IDE和使用方法,有需要的小伙伴可以參考下2016-08-08
解決mybatis-generator生成Mapper文件沒有Selective結(jié)尾的問題
這篇文章主要介紹了解決mybatis-generator生成Mapper文件沒有Selective結(jié)尾的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Java?8?的異步編程利器?CompletableFuture的實例詳解
這篇文章主要介紹了Java?8?的異步編程利器?CompletableFuture?詳解,本文通過一個例子給大家介紹下Java?8??CompletableFuture異步編程的相關(guān)知識,需要的朋友可以參考下2022-03-03
基于Java將Excel科學(xué)計數(shù)法解析成數(shù)字
這篇文章主要介紹了基于Java將Excel科學(xué)計數(shù)法解析成數(shù)字,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09
Spring運(yùn)行環(huán)境Environment的解析
本文主要介紹了Spring運(yùn)行環(huán)境Environment的解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
Spring?Boot實現(xiàn)文件上傳的兩種方式總結(jié)
應(yīng)用開發(fā)過程中,文件上傳是一個基礎(chǔ)的擴(kuò)展功能,它的目的就是讓大家共享我們上傳的文件資源,下面這篇文章主要給大家總結(jié)介紹了關(guān)于Spring?Boot實現(xiàn)文件上傳的兩種方式,需要的朋友可以參考下2023-05-05

