首页 > 代码库 > Java总结篇系列:Java 反射
Java总结篇系列:Java 反射
Java反射:
1 package com.corn; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 import java.lang.reflect.InvocationTargetException; 6 import java.lang.reflect.Method; 7 8 public class TestReflect { 9 10 public static void main(String[] args) { 11 12 // 获取“类类型对象” 方法1 13 Class<?> c0 = User.class; 14 15 // 获取“类类型对象” 方法2 16 User user1 = new User(); 17 Class<?> c1 = user1.getClass(); 18 19 User user2 = new User(); 20 Class<?> c2 = user2.getClass(); 21 22 System.out.println("user class instance 0:" + c0); //user class instance 0:class com.corn.User 23 System.out.println("user class instance 1:" + c1); //user class instance 1:class com.corn.User 24 System.out.println("user class instance 2:" + c2); //user class instance 2:class com.corn.User 25 26 //c0 == c1 :true, c1 == c2 :true 27 System.out.println("c0 == c1 :" + (c0 == c1) + ", c1 == c2 :" + (c1 == c2)); 28 29 try { 30 // 获取“类类型对象” 方法3 31 Class<?> c3 = Class.forName("com.corn.User"); 32 System.out.println("user class c3:" + c3); //user class c3:class com.corn.User 33 34 try { 35 User user3 = (User) c3.newInstance(); 36 37 //Constructor public com.corn.User(int,java.lang.String,int) 38 //Constructor public com.corn.User(int,java.lang.String) 39 //Constructor public com.corn.User() 40 Constructor<?>[] cons = c3.getConstructors(); 41 for (int i = 0; i < cons.length; i++) { 42 // 一次返回类定义中所有public修饰符修饰的“构造器对象”,其与类定义中的构造器顺序不一定相同 43 System.out.println("Constructor " + cons[i]); 44 } 45 46 try { 47 User user4 = (User) cons[1].newInstance(51, "corn"); 48 //user instance 4:user instance uid:51 name:corn 49 System.out.println("user instance 4:" + user4); 50 51 // 返回特定参数类型的“构造器对象”所新建的实例 52 User user40; 53 user40 = (User) c3.getConstructor(int.class, String.class).newInstance(520, "corn0"); 54 //user instance 40:user instance uid:520 name:corn0 55 System.out.println("user instance 40:" + user40); 56 57 // 返回该类“类类型对象”的所有的父类“类类型对象” 58 Class<?> father = c3.getSuperclass(); 59 //father class instance class com.corn.Person 60 System.out.println("father class instance " + father); 61 62 //返回类对象所有的接口对象(其实也是类类型对象)数组 63 Class<?>[] interfaceArray = c3.getInterfaces(); 64 //interface class instance 0 interface com.corn.Workable 65 //interface class instance 1 interface com.corn.Thinkable 66 for (int i = 0; i < interfaceArray.length; i++) { 67 // 与implements中接口顺序相同 68 System.out.println("interface class instance " + i + " " + interfaceArray[i]); 69 } 70 71 } catch (IllegalArgumentException e) { 72 e.printStackTrace(); 73 } catch (InvocationTargetException e) { 74 e.printStackTrace(); 75 } 76 77 } catch (InstantiationException e) { 78 e.printStackTrace(); 79 } catch (IllegalAccessException e) { 80 e.printStackTrace(); 81 } 82 } catch (ClassNotFoundException e) { 83 e.printStackTrace(); 84 } catch (Exception e) { 85 e.printStackTrace(); 86 } 87 88 // 返回“类类型对象”所具有的全部属性实例/对象 89 Field[] fieldArray = c0.getDeclaredFields(); 90 //filed 0 private int com.corn.User.uid 91 //filed 1 private java.lang.String com.corn.User.name 92 //filed 2 private int com.corn.User.age 93 for (int i = 0; i < fieldArray.length; i++) { 94 System.out.println("filed " + i + " " + fieldArray[i]); 95 } 96 97 User u = new User(12, "yumidi", 99); 98 99 try {100 // 直接获取private/私有属性的值101 Field nameField = c0.getDeclaredField("name");102 //取消Java对访问修饰符的检查 103 nameField.setAccessible(true);104 String nameValue =http://www.mamicode.com/ (String) nameField.get(u);105 //name:yumidi106 System.out.println("name:" + nameValue);107 108 // 直接改变private/私有属性的值109 nameField.set(u, "corn");110 //new name:corn111 System.out.println("new name:" + u.getName());112 113 } catch (NoSuchFieldException e) {114 e.printStackTrace();115 } catch (SecurityException e) {116 e.printStackTrace();117 } catch (Exception e) {118 e.printStackTrace();119 }120 121 //访问私有方法122 try {123 Method method = c0.getDeclaredMethod("getResult");124 //取消Java对访问修饰符的检查125 method.setAccessible(true);126 int result = (int) method.invoke(u);127 //result:1000128 System.out.println("result:" + result);129 130 } catch (NoSuchMethodException e) {131 e.printStackTrace();132 } catch (SecurityException e) {133 e.printStackTrace();134 } catch (Exception e) {135 e.printStackTrace();136 }137 138 }139 }140 141 class User extends Person implements Workable, Thinkable {142 143 private int uid;144 private String name;145 private int age;146 147 public User() {148 149 }150 151 private User(int uid) {152 this.uid = uid;153 }154 155 protected User(String name) {156 this.name = name;157 }158 159 public User(int uid, String name) {160 this.uid = uid;161 this.name = name;162 }163 164 public User(int uid, String name, int age) {165 this.uid = uid;166 this.name = name;167 this.age = age;168 }169 170 public int getUid() {171 return uid;172 }173 174 public void setUid(int uid) {175 this.uid = uid;176 }177 178 public String getName() {179 return name;180 }181 182 public void setName(String name) {183 this.name = name;184 }185 186 public int getAge() {187 return age;188 }189 190 public void setAge(int age) {191 this.age = age;192 }193 194 private int getResult() {195 return 1000;196 }197 198 @Override199 public String toString() {200 return "user instance uid:" + this.uid + " name:" + this.name;201 }202 203 }204 205 class Person {206 207 }208 209 interface Workable {210 211 }212 213 interface Thinkable {214 215 }
Java总结篇系列:Java 反射
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。