java反射基礎使用方法
User.class
public class User {
private int age;
private String name;
public User() {
super();
}
public User(String name) {
super();
this.name = name;
}
public User(int age, String name) {
super();
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [age=" + age + ", name=" + name + "]";
}
}
反射的基礎方法講解
public class TestReflect extends User implements Serializable {
private static final long serialVersionUID = 6296302711043277522L;
// 經過一個對象得到完整的包名和類名
// public static void main(String[] args) {
// TestReflect testReflect = new TestReflect();
// System.out.println(testReflect.getClass().getName());
// }
// 實例化Class類對象
// public static void main(String[] args) throws ClassNotFoundException {
// Class<?> class1 = null;
// Class<?> class2 = null;
// Class<?> class3 = null;
//
// class1 = Class.forName("com.example.demo.reflect.TestReflect");
// class2 = new TestReflect().getClass();
// class3 = TestReflect.class;
//
// System.out.println("類名稱 " + class1.getName());
// System.out.println("類名稱 " + class2.getName());
// System.out.println("類名稱 " + class3.getName());
//
//
// }
// 獲取一個對象的父類與實現的接口
// public static void main(String[] args) throws ClassNotFoundException {
// Class<?> clazz = Class.forName("com.example.demo.reflect.TestReflect");
// //取得父類
// Class<?> parentClass = clazz.getSuperclass();
// System.out.println("clazz的父類爲:" + parentClass.getName());
//
//
// // clazz的父類爲: java.lang.Object
// // 獲取全部的接口
// Class<?> intes[] = clazz.getInterfaces();
// System.out.println("clazz實現的接口有:");
// for (int i = 0; i < intes.length; i++) {
// System.out.println((i + 1) + ":" + intes[i].getName());
// }
// // clazz實現的接口有:
// // 1:java.io.Serializable
//
// }
// 經過反射機制實例化一個類的對象
// public static void main(String[] args) throws Exception {
// Class<?> class1 = null;
// class1 = Class.forName("com.example.demo.entity.User");
// // 第一種方法,實例化默認構造方法,調用set賦值
// User user = (User) class1.newInstance();
// user.setAge(20);
// user.setName("hly");
// System.out.println(user);
// // 結果 User [age=20, name=Rollen]
// // 第二種方法 取得所有的構造函數 使用構造函數賦值
// Constructor<?> cons[] = class1.getConstructors();
// // 查看每一個構造方法須要的參數
// for(int i=0;i<cons.length;i++){
// Class<?> clazzs[] = cons[i].getParameterTypes();
// System.out.print("cons["+i+"] (");
// for (int j = 0; j < clazzs.length; j++) {
// if (j == clazzs.length - 1)
// System.out.print(clazzs[j].getName());
// else
// System.out.print(clazzs[j].getName() + ",");
// }
// System.out.println(")");
// }
// user = (User) cons[1].newInstance("Rollen");
// System.out.println(user);
// // 結果 User [age=0, name=Rollen]
// user = (User) cons[0].newInstance(20, "Rollen");
// System.out.println(user);
// // 結果 User [age=20, name=Rollen]
// }
// 獲取某個類的所有屬性
// public static void main(String[] args) throws ClassNotFoundException {
// Class<?> clazz = Class.forName("com.example.demo.reflect.TestReflect");
// System.out.println("===============本類屬性===============");
// // 取得本類的所有屬性
// Field[] field = clazz.getDeclaredFields();
// for (int i = 0; i < field.length; i++) {
// // 權限修飾符
// int mo = field[i].getModifiers();
// System.out.println("mo:"+mo);
// String priv = Modifier.toString(mo);
// // 屬性類型
// Class<?> type = field[i].getType();
// System.out.println(priv + "1 " + type.getName() + "1 " + field[i].getName() + ";");
// }
//
// System.out.println("==========實現的接口或者父類的屬性==========");
// // 取得實現的接口或者父類的屬性
// Field[] filed1 = clazz.getFields();
// for (int j = 0; j < filed1.length; j++) {
// // 權限修飾符
// int mo = filed1[j].getModifiers();
// String priv = Modifier.toString(mo);
// // 屬性類型
// Class<?> type = filed1[j].getType();
// System.out.println(priv + " " + type.getName() + " " + filed1[j].getName() + ";");
// }
//
// }
// 獲取某個類的所有方法
//
// public static void main(String[] args) throws ClassNotFoundException {
// Class<?> clazz = Class.forName("com.example.demo.entity.User");
// Method method[] = clazz.getMethods();
// for (int i = 0; i < method.length; ++i) {
// Class<?> returnType = method[i].getReturnType();
// Class<?> para[] = method[i].getParameterTypes();
// int temp = method[i].getModifiers();
// System.out.print(Modifier.toString(temp) + " ");
// System.out.print(returnType.getName() + " ");
// System.out.print(method[i].getName() + " ");
// System.out.print("(");
// for (int j = 0; j < para.length; ++j) {
// System.out.print(para[j].getName() + " " + "arg" + j);
// if (j < para.length - 1) {
// System.out.print(",");
// }
// }
// Class<?> exce[] = method[i].getExceptionTypes();
// if (exce.length > 0) {
// System.out.print(") throws ");
// for (int k = 0; k < exce.length; ++k) {
// System.out.print(exce[k].getName() + " ");
// if (k < exce.length - 1) {
// System.out.print(",");
// }
// }
// } else {
// System.out.print(")");
// }
// System.out.println();
// }
// }
// 經過反射機制調用某個類的方法
// public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
// Class<?> clazz = Class.forName("com.example.demo.reflect.TestReflect");
// // 調用TestReflect類中的reflect1方法
// Method method = clazz.getMethod("reflect1");
// method.invoke(clazz.newInstance());
// // 調用TestReflect的reflect2方法
// method = clazz.getMethod("reflect2",int.class,String.class);
// method.invoke(clazz.newInstance(),20,"hly");
//
//
// }
//
// public void reflect1() {
// System.out.println("Java 反射機制 - 調用某個類的方法1.");
// }
// public void reflect2(int age, String name) {
// System.out.println("Java 反射機制 - 調用某個類的方法2.");
// System.out.println("age -> " + age + ". name -> " + name);
// }
//
//
// private String proprety = null;
//
// public static void main(String[] args) throws Exception {
// Class<?> clazz = Class.forName("com.example.demo.reflect.TestReflect");
// Object obj = clazz.newInstance();
// Field field = clazz.getDeclaredField("proprety");
// field.setAccessible(true);
// field.set(obj,"javafanshe");
// System.out.println(field.get(obj));
// System.out.println(obj);
// // 獲取類加載器的方法
// TestReflect testReflect = new TestReflect();
// System.out.println("類加載器 " + testReflect.getClass().getClassLoader().getClass().getName());
//
// }
// public static void main(String[] args) throws Exception {
// MyInvocationHandler demo = new MyInvocationHandler();
// Object object = demo.bind(new RealSubject());
// System.out.println("object:"+object);
// Subject sub = (Subject) object;
// String info = sub.say("Rollen", 20);
// System.out.println(info);
// }
//
//}
//interface Subject {
// public String say(String name,int age);
//}
//
//class RealSubject implements Subject {
// public String say(String name,int age){
// return name + " " + age;
// }
//}
//
//class MyInvocationHandler implements InvocationHandler {
// private Object obj = null;
// public Object bind(Object obj) {
// this.obj = obj;
// /*public static Object newProxyInstance(ClassLoader loader,
// Class<?>[] interfaces,
// InvocationHandler h)
// throws IllegalArgumentException*/
// return Proxy.newProxyInstance(
// obj.getClass().getClassLoader(), //用哪一個類的加載器去加載代理對象
// obj.getClass().getInterfaces() /*interfaces的動態代理類須要實現的接口*/,this);//h:動態代理方法在執行時,會調用h裏面的invoke方法去執行
// }
//
// public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// System.out.println(this);
// System.out.println("!!!!!"+this.obj);
// Object temp = method.invoke(this.obj, args);
// return temp;
// }
public static void main(String[] args) throws Exception {
int[] temp = { 1, 2, 3, 4, 5 };
Class<?> demo = temp.getClass().getComponentType();
System.out.println("數組類型: " + demo.getName());
System.out.println("數組長度 " + Array.getLength(temp));
System.out.println("數組的第一個元素: " + Array.get(temp, 0));
Array.set(temp, 0, 100);
System.out.println(Array.class.getName());
System.out.println("修改以後數組第一個元素爲: " + Array.get(temp, 0));
}
}
/**
* 在java中有三種類類加載器。
*
* 1)Bootstrap ClassLoader 此加載器採用c++編寫,通常開發中不多見。
*
* 2)Extension ClassLoader 用來進行擴展類的加載,通常對應的是jrelibext目錄中的類
*
* 3)AppClassLoader 加載classpath指定的類,是最經常使用的加載器。同時也是java中默認的加載器。
*
* 若是想要完成動態代理,首先須要定義一個InvocationHandler接口的子類,已完成代理的具體操做。
*
* @author xsoftlab.net
*
*/