初学Java反射之简单明了的反射例子。

在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java学习,请浏览疯狂java官网。
  Java反射在我们Java学习的过程中是非常重要的知识点。可能有些同学认为这个学习起来不容易理解,其实就我个人而言还是比较简单,学习起来也比较容易理解。下面我给大家总结一下Java反射学习的要点,同时给出几个比较好的例子。
  1、Java反射的概念
  反射含义:可以获取正在运行的Java对象。
  2、Java反射的功能
  1)可以判断运行时对象所属的类
  2)可以判断运行时对象所具有的成员变量和方法
  3)通过反射甚至可以调用到private的方法
  4)生成动态代理
  3、实现Java反射的类
  1)Class:它表示正在运行的Java应用程序中的类和接口
  2)Field:提供有关类或接口的属性信息,以及对它的动态访问权限
  3)Constructor:提供关于类的单个构造方法的信息以及对它的访问权限
  4)Method:提供关于类或接口中某个方法信息
  注意:Class类是Java反射中最重要的一个功能类,所有获取对象的信息(包括:方法/属性/构造方法/访问权限)都需要它来实现

    

/**
* 反射的基础用法.
* @param <T>

* @throws ClassNotFoundException
*/
@SuppressWarnings("rawtypes")
public static <T> void testReflectBase(Object clazz) throws ClassNotFoundException{
// Class c1 = Object.class;
Class c1 = clazz.getClass();
Class c2 = Class.forName("com.evangelsoft.crosslink.qrcode.test.TestCode");
Class c3 = new TestCode().getClass();

//完整的包名+类名。
/*System.out.println(c1);
*System.out.println(c2);
*System.out.println(c3);
*/

printlnDemo("获取类的包名");
String package01 = c1.getPackage().getName();
String package02 = c2.getPackage().getName();
println("package01",package01 );
println("package02",package02 );
println("");

printlnDemo("获取类的修饰符");
int mod = c1.getModifiers();
String modifier = Modifier.toString(mod);
println("mod",mod);
println("modifier",modifier);
println("");

printlnDemo("获取完整限定名(包名+类名)");
String canonical = c1.getCanonicalName();
String className = c1.getName();
println("canonical", canonical);
println("className",className );
println("");

printlnDemo("获取父类(包+类名)");
Class superClazz = c1.getSuperclass();
String superClazzName = superClazz.getName();
println("superClazzName", superClazzName);
println("");

printlnDemo("获取实现的接口");
Class[] interfaces = c1.getInterfaces();
for(Class t : interfaces){
println("interfacesName", t.getName());
}
println("");

printlnDemo("获取类的成员变量");
Field[] fields = c1.getDeclaredFields();
for(Field field : fields){
//获取每个字段的访问修饰符
modifier = Modifier.toString(field.getModifiers());
println("field.getModifiers()", field.getModifiers());
println("filedModifier", modifier);
//获取字段数据类型对应的Class对象。
Class fieldClassType = field.getType();

//获取字段名
String name = field.getName();
println("fieldName", name);

//如果是数组类型则需要特别处理
if(fieldClassType.isArray()){
String arrayType = fieldClassType.getComponentType().getName()+ "[]";
println("fieldType", arrayType);
} else {
println("fieldType", fieldClassType);
}
println("");
}
println("");

printlnDemo("获取类的构造方法");
Constructor[] constructors = c1.getDeclaredConstructors();
for(Constructor constructor : constructors){
//构造方法名
String name = constructor.getName();
//获取访问修饰符
modifier = Modifier.toString(constructor.getModifiers());
print(""+modifier +" " + name + "(");

//获取构造方法中的参数
Class[] paramTypes = constructor.getParameterTypes();
for(int i = 0 ; i < paramTypes.length ; i++){
if(i > 0){
print(",");
}
if(paramTypes[i].isArray()){
print(paramTypes[i].getComponentType().getName()+"[]");
} else {
print(paramTypes[i].getName());
}
}
println(");");
}
println("");

printlnDemo("获取成员方法");
Method[] methods = c1.getDeclaredMethods();
for(Method method : methods){
modifier = Modifier.toString(method.getModifiers());
//获取方法的返回类型
Class returnType = method.getReturnType();
if(returnType.isArray()){
String arrType = returnType.getComponentType().getName() + "[]";
print("" + modifier +" " + arrType + " " + method.getName() + "(");
} else {
print("" + modifier + " " + returnType.getName() + " " + method.getName() + "(");
}
Class[] paramTypes = method.getParameterTypes();
for (int i = 0; i < paramTypes.length; i++) {
if(i > 0){
print(",");
}
if(paramTypes[i].isArray()){
print(paramTypes[i].getComponentType().getName() + "[]");
} else {
print(paramTypes[i].getName());
}
}
println(")");
}
println("");
}

@SuppressWarnings("unchecked")
public static <T> void testEasyUse(Object clazz)
throws InstantiationException, IllegalAccessException,
SecurityException, NoSuchFieldException, NoSuchMethodException,
IllegalArgumentException, InvocationTargetException {
/*
* 反射调用方法,可以通过Method类的invoke方法实现动态方法的调用
*  public Object invoke(Object obj, Object... args);
*   第一个参数代表对象,
*   第二个参数代表执行方法的参数Objeect... ,表示调用方法的参数有几个就写几个。
* 若反射要调用类的某个私有方法, 
* 可以在这个私有方法对应的Method对象先调用setAccessible(true);
*/
//Class c1 = clazz.getClass();
Class c1 = clazz.getClass();
//利用反射来创建类的对象。
TestCode instance = (TestCode) c1.newInstance();
println("userName", instance.userName );
println("password", instance.password );
println("");

Method method = c1.getDeclaredMethod("setUserName", String.class);
method.invoke(instance, "Java反射的学习");
println("username", instance.getUserName());
method = c1.getDeclaredMethod("setPassword", String.class);
method.setAccessible(true);
method.invoke(instance, "反射执行Private修饰的方法");
println("password", instance.password);
println("");
/*
* getMethod(name,Class[]... args); 参数可以是数组。 
* getMethod(name,Class... args);   也可以是单个单个定义。
* 这种只能调用公共访问修饰的
* 访问private 找不到的会抛出: NoSuchMethodException。
*/
method = c1.getMethod("updataUser", new Class[]{ String.class, String.class});
method.invoke(instance, "反射调用公共修饰符的用户","反射调用公共修饰符的密码");
println("userName", instance.userName );
println("password", instance.password );
println("");

/*
* getDeclaredMethod(name,Class[]... args); 参数可以是数组。 
* getDeclaredMethod(name,Class... args);  也可以是单个单个定义。
* 这种调用public、private、protected修饰的都能访问到.
* 找不到的会抛出: NoSuchMethodException。
*/
method = c1.getDeclaredMethod("updataUser", new Class[]{ String.class, String.class, int.class});
method.invoke(instance, "声明式的方法反射调用公共修饰符的用户","声明式的方法反射调用公共修饰符的密码",999);
println("userName", instance.getUserName() );
println("password", instance.getUserName() );
println("age", instance.getAge() );
println("");
}

public static void main(String[] args) {
try {
testReflectBase(new String());
testEasyUse(new TestCode());
} catch (Exception e) {
e.printStackTrace();
}
}

public String userName;
private String password;
private int age;

public String getUserName() {
return userName;
}




public void setUserName(String userName) {
this.userName = userName;
}




public String getPassword() {
return password;
}




private void setPassword(String password) {
this.password = password;
}




public int getAge() {
return age;
}




public void setAge(int age) {
this.age = age;
}

public void updataUser(String account, String password){
this.userName = account;
this.password = password;
}

private void updataUser(String account, String password, int age){
this.userName = account;
this.password = password;
this.age = age;
}

private static void println(Object o){
System.out.println(o);
}

private static void print(Object o){
System.out.print(o);
}
/**
* 演示
* @param describe 描述
*/
private static void printlnDemo(String describe){
println("[" + describe+"]");
}
/**
* 输出结果。
* @param printKey
* @param printValue
*/
private static void println(Object printKey, Object printValue) {
println(printKey + " : " + printValue);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值