Java之反射程式碼演示說明
還不存在的類–即我們需要使用反射來使用的類
Person類:
package com.qf.demo4;
public class Person {
private String name;
public int age;
static int weight;
int male;
protected int num;
public Person(String name, int age, int weight) {
this.name = name;
this.age = age;
this.weight = weight;
System.out.println("有引數的構造方法");
}
public Person() {
System.out.println("無引數的構造方法");
}
public void eat() {
System.out.println("吃");
}
public void drink(String type) {
System.out.println("喝" + type);
}
public String sleep() {
System.out.println("睡");
return "呵呵";
}
private void play() {
System.out.println("玩");
}
public static void hehe() {
System.out.println("heheheheh");
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ",weight = "+weight+"]";
}
}
演示程式碼:
Test1:建立Class物件
package com.qf.demo4;
import com.qf.demo.Person;
/**
* 每一個類只有一個class 物件
* com.qf.demo.Person 包名+類名 全限定名
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
// 建立Class 物件
// 第一種方式:類.class
Class class1 = Person.class;
System.out.println(class1.hashCode());
// 第二種方式:建立類的物件;然後--物件.getClass()
Person person = new Person();
Class class2 = person.getClass();
System.out.println(class2.hashCode());
// 第三種方式:使用forname方法,引數為相對於本工程的地址
try {
Class class3 = Class.forName("com.qf.demo.Person");
System.out.println(class3.hashCode());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Test2:建立Constructor物件,並建立Person類(還沒有的類)物件
package com.qf.demo4;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Test2 {
public static void main(String[] args) {
try {
Class class1 = Class.forName("com.qf.demo4.Person");
Constructor[] constructors = class1.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
// 1 通過構造方法建立 Perosn物件
Constructor constructor = class1.getConstructor(null);// 得到無參的構造方法
Person person = (Person) constructor.newInstance(null);
System.out.println(person);
// 2 利用有引數的構造方法建立物件
Constructor constructor2 = class1.getConstructor(String.class,int.class,int.class);
Person person2 = (Person) constructor2.newInstance("張三",5,9);
System.out.println(person2);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Test3:獲取方法,以及呼叫方法
package com.qf.demo4;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test3 {
public static void main(String[] args) {
try {
Class class1 = Class.forName("com.qf.demo4.Person");
// 得到構造方法
Constructor constructor = class1.getConstructor(null);
Object object = constructor.newInstance(null);
Method[] methods = class1.getMethods();// 得到本類和父類的非私有的方法
Method[] methods2 = class1.getDeclaredMethods();// 得到本類中宣告的所有的方法(包括私有)
// 得到 無參 無返回值的 方法並且呼叫
Method method = class1.getMethod("eat", null);
// 呼叫方法的物件 實際引數
method.invoke(object, null);// 是哪個方法被呼叫
// 呼叫 有引數 無返回值的方法
Method method2 = class1.getMethod("drink", String.class);
method2.invoke(object, "水");
// 有返回值的
Method method3 = class1.getMethod("sleep", null);
Object object2 = method3.invoke(object, null);// invoke方法的返回值就是呼叫的方法的返回值
System.out.println(object2);
// 得到靜態的方法
Method method4 = class1.getMethod("hehe", null);
method4.invoke(null, null);// 靜態方法不需要傳遞物件 直接寫null
// 私有的 私有的方法 必須用 getDeclaredMethod 才能得到
Method method5 = class1.getDeclaredMethod("play", null);
method5.setAccessible(true);// 私有方法預設沒有許可權呼叫,必須單獨設定呼叫許可權
method5.invoke(object, null);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
反射定義:http://blog.csdn.net/baidu_37107022/article/details/71234940
相關文章
- 說說java的反射Java反射
- 好程式設計師Java培訓分享註解與反射原理說明程式設計師Java反射
- 說說 Java 反射機制Java反射
- 反射記憶體卡原理說明反射記憶體
- Java反射增強:程式碼模型Java反射模型
- Java之反射Java反射
- MySQL:AHI 部分程式碼流程說明MySql
- Java非阻塞I/O模型之NIO說明Java模型
- Java隔離容器之sofa-ark使用說明及原始碼解析Java原始碼
- MySQL常見錯誤程式碼及程式碼說明MySql
- WebSocket 程式碼演示Web
- JAVA特性 之 反射(Reflection)Java反射
- java反射之Class類Java反射
- Java之反射--練習Java反射
- 支付寶程式碼示例結構說明
- php檔案操作錯誤程式碼說明PHP
- java 類路徑說明Java
- java String類說明Java
- Java Out Of Memory解決之JAVA_OPTS引數說明與配置Java
- 2.2反射性xss案例演示反射
- shell簡介之bash程式設計之引數說明(轉)程式設計
- Alternative account/備選科目程式碼配置說明
- Java學習之反射篇Java反射
- Java之註解與反射Java反射
- 【Java基礎】RTTI與反射之JavaJava反射
- 程式碼的架構之說架構
- 好程式設計師Java培訓分享Java之反射技術程式設計師Java反射
- Oracle golden gate程式說明OracleGo
- Oracle 後臺程式 說明Oracle
- 程式碼說事 之 建立java物件的初始化順序Java物件
- java中關於如何執行jar格式程式的說明JavaJAR
- Java高階語法之反射Java反射
- java 反射之操作靜態MethodJava反射
- Atomikos原始碼說明原始碼
- Java執行緒池使用說明Java執行緒
- 如何製作Java文件說明書Java
- java中finalkeyword使用說明Java
- LGWR DBWR SMON 等程式說明