zoukankan      html  css  js  c++  java
  • 非常好的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反射中最重要的一个功能类,所有获取对象的信息(包括:方法/属性/构造方法/访问权限)都需要它来实现

      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培训紧跟最前沿的技术潮流,采用的都是企业最真实的项目开发,培养学生的实践动手能力。技术在不断更新换代,在疯狂软件学院你能学到最前沿的Java技术,疯狂Java培训主要培养的是Java专业人才。学员毕业之后的代码量至少达到项目经理的水平。疯狂软件学院有完善的就业服务机制,学员毕业时,可以享受免费终身推荐就业服务。根据学员的特点和企业的要求,为学员推荐最合适的岗位。

  • 相关阅读:
    python -m pip install captcha --user
    用隐马尔可夫模型做基因预测
    爬取知乎如何通俗易懂地解释「协方差」与「相关系数」的概念?
    梯度弥散与梯度爆炸
    CIFAR-10数据集图像分类【PCA+基于最小错误率的贝叶斯决策】
    CIFAR-10 dataset 的下载与使用
    JMeter Don't use GUI mode for load testing!
    JMeter5.0版本安装及配置
    POSTMAN之断言
    PLSQL基础使用
  • 原文地址:https://www.cnblogs.com/gojava/p/3339013.html
Copyright © 2011-2022 走看看