1、Java反射的概念
  反射含义:可以获取正在运行的Java对象。
  2、Java反射的功能
  1)可以判断运行时对象所属的类
  2)可以判断运行时对象所具有的成员变量和方法
  3)通过反射甚至可以调用到private的方法
  4)生成动态代理
  3、实现Java反射的类
  1)Class:它表示正在运行的Java应用程序中的类和接口
  2)Field:提供有关类或接口的属性信息,以及对它的动态访问权限
  3)Constructor:提供关于类的单个构造方法的信息以及对它的访问权限
  4)Method:提供关于类或接口中某个方法信息
  注意:Class类是Java反射中最重要的一个功能类,所有获取对象的信息(包括:方法/属性/构造方法/访问权限)都需要它来实现
  4、编写Java反射程序的步骤:
  1)必须首先获取一个类的Class对象
  例如:

  
Class c1 = Test.class;
  Class c2 = Class.forName(“com.reflection.Test”);
  Class c3 = new Test().getClass();
  2)然后分别调用Class对象中的方法来获取一个类的属性/方法/构造方法的结构
  注意:如果要能够正常的获取类中方法/属性/构造方法应该重点掌握如下的反射类
  Field
  Constructor
  Method
  示例:此程序例子告诉大家如何操作Class/Field/Constructor/Method等与Java反射相关的类
  package com.reflection;
  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;
  public class TestReflection {
  private String username;
  private String password;
  private int[] age;
  public void setUserName(String username) {
  this.username = username;
  }
  private void setPassWord(String password) {
  this.password = password;
  }
  public static void test01() throws ClassNotFoundException {
  Class c1 = TestReflection.class;
  Class c2 = Class.forName("com.reflection.TestReflection");
  //获取指定的包名
  String package01 = c1.getPackage().getName();
  String package02 = c2.getPackage().getName();
  System.out.println("package01 = " + package01);
  System.out.println("package02 = " + package02);
  //获取类的修饰符
  int mod = c1.getModifiers();
  String modifier = Modifier.toString(mod);
  System.out.println("modifier = " + modifier);
  //获取指定类的完全限定名
  String className = c1.getName();
  System.out.println("className = " + className);
  //获取指定类的父类
  Class superClazz = c1.getSuperclass();
  String superClazzName = superClazz.getName();
  System.out.println("superClazzName = " + superClazzName);
  //获取实现的接口
  Class[] interfaces = c1.getInterfaces();
  for (Class t : interfaces) {
  System.out.println("interfacesName = " + t.getName());
  }
  //获取指定类的成员变量
  Field[] fields = c1.getDeclaredFields();
  for (Field field : fields) {
  modifier = Modifier.toString(field.getModifiers()); //获取每个
  字段的访问修饰符
  Class type = field.getType(); //获取字段的数据类型所对应的
  Class对象
  String name = field.getName(); //获取字段名
  if (type.isArray()) { //如果是数组类型则需要特别处理
  String arrType = type.getComponentType().getName() +
  "[]";
  System.out.println("" + modifier + " " + arrType + " "
  + name + ";");
  } else {
  System.out.println("" + modifier + " " + type + " " +
  name + ";");
  }
  }
  //获取类的构造方法
  Constructor[] constructors = c1.getDeclaredConstructors();
  for (Constructor constructor : constructors) {
  String name = constructor.getName(); //构造方法名
  modifier = Modifier.toString(constructor.getModifiers()); //获取访问修饰符
  System.out.println("" + modifier +" " + name + "(");
  Class[] paramTypes = constructor.getParameterTypes(); //获取构造方法中的参数
  for (int i = 0; i < paramTypes.length; i++) {
  if (i > 0) {
  System.out.print(",");
  }
  if (paramTypes[i].isArray()) {
  System.out.println(paramTypes
  [i].getComponentType().getName()+"[]");
  } else {
  System.out.print(paramTypes[i].getName());
  }
  }
  System.out.println(");");
  }
  //获取成员方法
  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()+"[]";
  System.out.print(""+modifier+" " + arrType + " " +
  method.getName() + "(");
  } else {
  System.out.print("" + modifier + " " +
  returnType.getName() + " " + method.getName() + "(");
  }
  Class[] paramTypes = method.getParameterTypes();
  for (int i = 0; i < paramTypes.length; i++) {
  if (i > 0) {
  System.out.print(",");
  }
  if (paramTypes[i].isArray()) {
  System.out.println(paramTypes
  [i].getComponentType().getName()+"[]");
  } else {
  System.out.print(paramTypes[i].getName());
  }
  }
  System.out.println(");");
  }
  }
  public static void test02() throws InstantiationException,
  IllegalAccessException, SecurityException, NoSuchMethodException,
  IllegalArgumentException, InvocationTargetException {
  //反射调用方法,可以通过Method类的invoke方法实现动态方法的调用
  //public Object invoke(Object obj, Object... args)
  //第一个参数代表对象
  //第二个参数代表执行方法上的参数
  //若反射要调用类的某个私有方法,可以在这个私有方法对应的Mehtod对象上先
  调用setAccessible(true)
  Class c1 = TestReflection.class;
  TestReflection t1 = (TestReflection) c1.newInstance(); //利用反射来创
  建类的对象
  System.out.println("username == " + t1.username);
  System.out.println("password == " + t1.password);
  Method method = c1.getDeclaredMethod("setUserName", String.class);
  method.invoke(t1, "Java反射的学习");
  System.out.println("username == " + t1.username);
  method = c1.getDeclaredMethod("setPassWord", String.class);
  method.setAccessible(true);
  method.invoke(t1, "反射执行某个Private修饰的方法");
  System.out.println("password == " + t1.password);
  }
  public static void main(String[] args) throws ClassNotFoundException,
  SecurityException, IllegalArgumentException, InstantiationException,
  IllegalAccessException, NoSuchMethodException, InvocationTargetException {
  // test01();
  test02();
  }
  }

  

非常好的Java反射例子的更多相关文章

  1. 【转】非常好的Java反射例子

    转自 http://www.douban.com/note/306848299/ 原文: 1.Java反射的概念 反射含义:可以获取正在运行的Java对象. 2.Java反射的功能 1)可以判断运行时 ...

  2. java反射例子

    一.field.setAccessible()方法: setAccessible方法是干什么用的呢让我们来看一段代码吧: public class User { private String name ...

  3. Java反射——引言

    Java反射——引言 原文地址:http://tutorials.jenkov.com/java-reflection/index.html *By Jakob Jenkov Java的反射机制使得它 ...

  4. 【译】1. Java反射——引言

    原文地址:http://tutorials.jenkov.com/java-reflection/index.html *By Jakob Jenkov Java的反射机制使得它可以在运行时检查类.接 ...

  5. java反射基础知识(三)

    原文地址:http://tutorials.jenkov.com/java-reflection/index.html http://www.cnblogs.com/penghongwei/p/329 ...

  6. (转)个例子让你了解Java反射机制

    个例子让你了解Java反射机制   原文地址:http://blog.csdn.net/ljphhj/article/details/12858767 JAVA反射机制:   通俗地说,反射机制就是可 ...

  7. 一个例子让你了解Java反射机制

    本文来自:blog.csdn.net/ljphhj JAVA反射机制: 通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运 ...

  8. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  9. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

随机推荐

  1. C++ 函数后加const

    1.非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误)2.表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,    任意修改它所在的类的成员的操作都是 ...

  2. UE4编程之C++创建一个FPS工程(一)创建模式&角色&处理输入

    转自:http://blog.csdn.net/u011707076/article/details/44180951 从今天开始,我们一起来学习一下,如何使用C++将一个不带有任何初学者内容的空模板 ...

  3. ALV详解:Function ALV(一)

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  4. Base64加密解密原理以及代码实现(VC++)

    Base64加密解密原理以及代码实现 转自:http://blog.csdn.net/jacky_dai/article/details/4698461 1. Base64使用A--Z,a--z,0- ...

  5. 基于jQuery的简易瀑布流实现

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. iOS - 3DTouch 3D 触摸

    1.3DTouch 简介 3DTouch 是 iOS9 + 系统下,在 iPhone6s(iPhone6s Plus)+ 手机上才能够使用的功能. 1.1 3DTouch 基本类型 1.主屏幕快速选项 ...

  7. 操作符 Thinking in Java 第三章

    3.1 更简单的打印语句 3.2 使用Java操作符 3.3 优先级 *int类型+String类型  直接转换为String类型 3.4 赋值 1. *引用=引用  两个引用指向同一个对象,所以操作 ...

  8. CentOS的包/库的找的地方

    1. http://pkgs.org/ 在这个网站里面 搜索相应的 包名,看能不能找到. 2. http://rpm.pbone.net/ 在这个网站里面 搜索相应的 包名,看能不能找到. 3.

  9. oracle 性能优化建议小结

    原则一:注意WHERE子句中的连接顺序: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHER ...

  10. 正则的小效果:-------> 过滤敏感词

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...