- package com.xmm.trri;
- /**
- * 接口:水果
- */
- public interface IFruit {
- /**
- * 方法:成长
- * @param sun 太阳
- * @return 成长信息
- * @throws Exception
- */
- String grow(String sun) throws Exception;
- }
- /**
- * 抽象类:苹果
- * 继承:水果
- */
- public abstract class AbstractApple implements IFruit {
- /**
- * 方法:成长
- * @param sun 太阳
- * @return 成长信息
- * @throws Exception
- */
- @Override
- public String grow(String sun) throws Exception {
- System.out.println(sun + "正在朝阳这苹果树呢!");
- return "";
- }
- }
- /**
- * 类:红苹果
- * 继承:苹果
- */
- public class RedApple extends AbstractApple {
- //名字
- private String name;
- //颜色
- public String color;
- //个数
- protected int size;
- //单个售价
- public static final int price = 10;
-
- /**
- * 无参构造函数
- * 一定声明为public类型,否则getConstructors无法得到
- */
- public RedApple() {
- super();
- System.out.println("初始化[RedApple]无参构造函数");
- setName("红富士");
- color = "红色";
- size = 5;
- }
-
- /**
- * 有参构造函数
- * @param name 名字
- * @param color 颜色
- * @param size 个数
- */
- public RedApple(String name, String color, int size) {
- this.setName(name);
- this.name = name;
- this.color = color;
- this.size = size;
- }
- /**
- * 获得:红苹果名称
- */
- public String getName() {
- return name;
- }
- /**
- * 设置:红苹果名称
- */
- public void setName(String name) {
- this.name = name;
- }
- /**
- * 方法:成长
- * @param sun 太阳
- * @return 成长信息
- * @throws Exception
- */
- @Override
- public String grow(String sun) throws Exception {
- return super.grow(sun);
- }
- /**
- * 构建消息
- * @param sun 太阳
- * @return 成长信息
- */
- private String buildMessage(String sun){
- return "红富士苹果正在享受" + sun + "呢!";
- }
- }
- package com.xmm.trri;
- import java.lang.reflect.Array;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.lang.reflect.Modifier;
- import java.util.Arrays;
- public class TestApple {
- public static void main(String[] args) {
-
- try {
- //获得类对象
- Class<?> clazz = Class.forName("com.xmm.trri.RedApple");
- printInfo("获得类对象", clazz);
- /*--获得类对象: class com.xmm.trri.RedApple--*/
-
- // 获得超类
- Class<?> superClass = clazz.getSuperclass();
- printInfo("获得超类", superClass);
- /*--获得超类: class com.xmm.trri.AbstractApple--*/
-
- // 获得所有父接口
- Class<?>[] interfaces = clazz.getInterfaces();
- printInfo("获得所有父接口", Arrays.toString(interfaces));
- /*--获得所有父接口: []--???--*/
-
- // 实例化
- RedApple redApple = (RedApple) clazz.newInstance();
- printInfo("实例化", redApple);
- /*--实例化: com.xmm.trri.RedApple@961dff--*/
-
- // 获得访问属性为 public 的构造方法
- Constructor<?>[] constructors = clazz.getConstructors();
- printInfo("获得构造方法", Arrays.toString(constructors));
- /*--获得构造方法: [public com.xmm.trri.RedApple(),
- * public com.xmm.trri.RedApple(java.lang.String,java.lang.String,int)]--*/
-
- // 获得指定参数的构造方法
- Constructor<?> constructor = clazz.getDeclaredConstructor(
- String.class, String.class, int.class);
- printInfo("获得指定构造方法", constructor);
- /*--获得指定构造方法: public com.xmm.trri.RedApple(java.lang.String,java.lang.String,int)--*/
-
- // 获得方法,getMethod 只能获得 public 方法,包括父类和接口继承的方法
- Method method = clazz.getMethod("grow", String.class);
- printInfo("获得公有方法", method);
- /*--获得公有方法: public java.lang.String com.xmm.trri.RedApple.grow(java.lang.String)
- * throws java.lang.Exception--*/
-
- // 调用方法
- method.invoke(redApple, "中午太阳");
- /*--中午太阳正在照耀这苹果树呢!--*/
-
-
- // 获得修饰符,包括 private/public/protect,static
- String modifier = Modifier.toString(method.getModifiers());
- printInfo("获得方法修饰符", modifier);
- /*--获得方法修饰符: public--*/
-
- // 获得参数类型
- Class<?>[] paramTypes = method.getParameterTypes();
- printInfo("获得方法参数类型", Arrays.toString(paramTypes));
- /*--获得方法参数类型: [class java.lang.String]--*/
-
- // 获得返回值类型
- Class<?> returnType = method.getReturnType();
- printInfo("获得方法返回值类型", returnType);
- /*--获得方法返回值类型: class java.lang.String--*/
-
- // 获得异常类型
- Class<?>[] excepTypes = method.getExceptionTypes();
- printInfo("获得方法异常类型", Arrays.toString(excepTypes));
- /*--获得方法异常类型: [class java.lang.Exception]--*/
-
- // 调用私有方法,getDeclaredMethod 获得类自身的方法,
- // 包括 public,protect,private 方法
- Method method2 = clazz.getDeclaredMethod("buildMessage", String.class);
- // 暴力反射
- method2.setAccessible(true);
- String result = (String)method2.invoke(redApple, "中午太阳");
- printInfo("获得私有方法", result);
- /*--获得私有方法: 红富士苹果正在享受中午太阳呢!--*/
-
- // 获得全部字段
- Field[] fields = clazz.getFields();
- printInfo("获得类全部字段", Arrays.toString(fields));
- /*--
- * 获得类全部字段:[public java.lang.String com.xmm.trri.RedApple.color,
- [public static final int com.xmm.trri.RedApple.price]
- * --*/
-
- // 获得类自身定义的指定字段
- Field field = clazz.getDeclaredField("name");
- printInfo("获得自身指定的名称字段", field);
- /*--获得自身指定的名称字段: private java.lang.String com.xmm.trri.RedApple.name--*/
-
- // 获得类及其父类,父接口定义的 public 字段
- Field field2 = clazz.getField("color");
- printInfo("获得公有的指定名称字段", field2);
- /*--获得公有的指定名称字段: public java.lang.String com.xmm.trri.RedApple.color--*/
-
- // 获得字段权限修饰符,包括private/public/protect,static,final
- String fieldModifier = Modifier.toString(field2.getModifiers());
- printInfo("获得字段权限修饰符", fieldModifier);
- /*--获得字段权限修饰符: public--*/
-
- // 操作数组
- int[] exampleArray = { 1, 2, 3, 4, 5 };
-
- // 获得数组类型
- Class<?> componentType = exampleArray.getClass().getComponentType();
- printInfo("数组类型", componentType.getName());
- /*--数组类型: int--*/
-
- // 获得长度
- printInfo("数组长度",
- Array.getLength(exampleArray));
- /*--数组长度: 5--*/
-
- // 获得指定元素
- printInfo("获得数组元素",
- Array.get(exampleArray, 2));
- /*--获得数组元素: 3--*/
-
- // 修改指定元素
- Array.set(exampleArray, 2, 6);
- printInfo("修改数组元素", Arrays.toString(exampleArray));
- /*--修改数组元素: [1, 2, 6, 4, 5]--*/
-
- // 获得当前的类加载器
- printInfo("获得当前类加载器",
- redApple.getClass().getClassLoader().getClass().getName());
- /*--获得当前类加载器: sun.misc.Launcher$AppClassLoader--*/
-
-
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }catch (NoSuchFieldException e) {
- e.printStackTrace();
- } catch (SecurityException e) {
- e.printStackTrace();
- }catch (NoSuchMethodException e) {
- e.printStackTrace();
- } catch (InstantiationException e) {
- e.printStackTrace();
- }
-
- }
-
- public static void printInfo(String info, Object obj) {
- if (obj.getClass().isArray()) {
- System.out.println(info + ": ");
- int length = Array.getLength(obj);
- System.out.println("Array Size: " + length);
- for (int i = 0; i < length; i++) {
- System.out.print("Array[" + i + "]: " + Array.get(obj, i)
- + ", ");
- }
- if (length != 0)
- System.out.println();
- }
- System.out.println(info + ": " + obj.toString());
- }
- }
复制代码 |
|