温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java 反射介绍

发布时间:2020-08-31 15:20:26 来源:网络 阅读:358 作者:nineteens 栏目:编程语言

  什么是反射?

  Java 反射,就是在运行状态中。

  获取任意类的名称、package信息、所有属性、方法、注解、类型、类加载器等

  获取任意对象的属性,并且能改变对象的属性

  调用任意对象的方法

  判断任意一个对象所属的类

  实例化任意一个类的对象

  Java 的动态就体现在这。通过反射我们可以实现动态装配,降低代码的耦合度;动态代理等。反射的过度使用会严重消耗系统资源。

  JDK 中 java.lang.Class 类,就是为了实现反射提供的核心类之一。

  获取 Class 的方法 、一个 jvm 中一种 Class 只会被实例化一次

  package constxiong.interview;

  /**

  * 测试 Class 类相关

  * @author ConstXiong

  * @date 2019-06-14 10:13:05

  */

  public class TestClass {

  public static void main(String[] args) throws ClassNotFoundException {

  testGetClass();

  }

  /**

  * 测试获取 Class 对象,获取 Class 名称

  * @throws ClassNotFoundException

  */

  @SuppressWarnings("rawtypes")

  public static void testGetClass() throws ClassNotFoundException {

  TestClass t = new TestClass();

  Class class1 = t.getClass();

  System.out.println(class1.getName());

  Class class2 = TestClass.class;

  System.out.println(class2.getName());

  Class class3 = Class.forName("constxiong.interview.TestClass");

  System.out.println(class3.getName());

  //一个 jvm 中一种 Class 只会被实例化一次,对上面的 Class 实例进行判断发现都是相等的

  System.out.println(class1 == class2);

  System.out.println(class1 == class3);

  }

  }

  Class 类中方法测试

  package constxiong.interview;

  /**

  * 测试 Class 类相关

  * @author ConstXiong

  * @date 2019-06-14 10:13:05

  */

  public class TestClass {

  private int i = 0;

  public int j = 1;

  private void t() {

  System.out.println("调用 TestClass 对象的 t() 方法");

  }

  public static void main(String[] args) throws ClassNotFoundException {

  testClassMethod();

  }

  /**

  * 测试 Class 对象的方法

  */

  public static void testClassMethod() {

  Class clazz = TestClass.class;

  System.out.println("clazz.getName() --> " + clazz.getName());//获取类全名(包含路径)

  System.out.println();

  System.out.println("clazz.getSimpleName() --> " + clazz.getSimpleName());//获取类简称

  System.out.println();

  System.out.println("clazz.getSuperclass() --> " + clazz.getSuperclass());//获取父类

  System.out.println();

  System.out.println("clazz.isInterface() --> " + clazz.isInterface());//判断是否为接口

  System.out.println();  无锡妇科医院 http://mobile.wxbhnkyy39.com/

  System.out.println("clazz.getFields() --> " + join(clazz.getFields(), "\r\n"));//获取 public 字段,包含父类 public 字段

  System.out.println();

  System.out.println("clazz.getDeclaredFields() --> " + join(clazz.getDeclaredFields(), "\r\n"));//获取所有字段

  System.out.println();

  System.out.println("clazz.getMethods() --> " + join(clazz.getMethods(), "\r\n"));//获取 public 方法,包含父类 public 方法

  System.out.println();

  System.out.println("clazz.getDeclaredMethods() --> " + join(clazz.getDeclaredMethods(), "\r\n"));//获取所有字段

  System.out.println();

  System.out.println("clazz.getConstructors() --> " + join(clazz.getConstructors(), "\r\n"));//获取构造方法

  System.out.println();

  try {

  clazz.newInstance().t();//实例化 TestClass 对象,调用对象中的 t() 方法

  } catch (InstantiationException e) {

  e.printStackTrace();

  } catch (IllegalAccessException e) {

  e.printStackTrace();

  }

  }

  /**

  * 拼接数组成字符串

  * @param objs

  * @param s

  * @return

  */

  private static String join(Object[] objs, String s) {

  StringBuilder r = new StringBuilder();

  for (Object obj : objs) {

  r.append(obj).append(s);

  }

  return r.toString();

  }

  }


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI