黑马程序员技术交流社区
标题:
为什么RedApple反射没有获得父接口
[打印本页]
作者:
ximi
时间:
2014-8-25 00:23
标题:
为什么RedApple反射没有获得父接口
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());
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2