• Java基础知识_毕向东_Java基础视频教程笔记(26 反射)


      Java反射机制:
      是在运行状态中,对于任意一个类(class)文件,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

    反射机制中的类:
    java.lang.Class;
    java.lang.reflect.Constructor; java.lang.reflect.Field;
    java.lang.reflect.Method;
    java.lang.reflect.Modifier;

    反射机制获取类:

    //第一种方式:最灵活最具扩展性
    Class demo = Class.forName("Demo");

    //第二种方式:
    //java中每个类型都有一个静态class属性来获取其对应的Class对象
    Class demo = Demo.class;

    //第三种方式:
    //java语言中任何一个java对象都有getClass 方法
    Demo d= new Demo();
    Class demo = d.getClass();

      创建对象 newInstance();
    Class demo =Class.forName("Demo");
    //调用了Demo的无参数构造方法,如果没有无参构造方法,可以使用getDeclaredMethod获取构造方法创建对象
    //创建此Class 对象所表示的类的一个新实例
    Object o = demo.newInstance();

    获取属性:分为所有的属性和指定的属性
      获取所有的属性的写法:

     1 public void getFields() throws ClassNotFoundException
     2 {
     3     //获取整个类
     4     Class c = Class.forName("java.lang.Long");
     5     //获取所有的属性,包括本类中的私有属性
     6     Field[] fs = c.getDeclaredFields();
     7     StringBuffer sb = new StringBuffer();
     8     //获取类的修饰符和类名
     9     sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() + "{
    ");
    10     for (Field field : fs)
    11     {
    12         sb.append("	");//制表符
    13         //获得属性的修饰符
    14         sb.append(Modifier.toString(field.getModifiers()) + " ");
    15         //属性的类型的名字
    16         sb.append(field.getType().getSimpleName() + " ");
    17         //属性的名字+回车
    18         sb.append(field.getName() + ";
    ");
    19     }
    20     sb.append("}");
    21     System.out.println(sb);
    22 }

      获取特定的属性:

     1 public void getField(String className, String fieldName, String value) throws Exception
     2 {
     3     //获取className类
     4     Class c = Class.forName(className);
     5     //获取fieldName属性
     6     Field field = c.getDeclaredField(fieldName);
     7     //实例化这个类赋
     8     Object o = c.newInstance();
     9     //打破封装,使用反射机制可以打破封装性,导致了java对象的属性不安全。
    10     field.setAccessible(true);
    11     //给o对象的fieldName属性赋值set
    12     field.set(o, value);
    13     //get
    14     System.out.println(field.get(o));
    15 }

    方法关键字                             含义

    getMethods()                            类或接口(包括超类和超接口继承的那些的类或接口)的公共方法
    getMethod(String name, Class<?>... parameterTypes)         类或接口的指定公共成员方法
    getDeclaredMethods()                        获取所有方法,包括私有方法,但不包括继承的方法
    getReturnType()                          获得方法的放回类型
    getParameterTypes()                          获得方法的传入参数类型
    getDeclaredMethod("方法名",参数类型.class,...)             获得特定的方法

    构造方法关键字                            含义
    getConstructors()                            获取类的所有公共构造方法
    getConstructor(Class<?>... parameterTypes)               获取类的指定公共构造方法
    getDeclaredConstructors()                        获取所有的构造方法,包括私有构造方法
    getDeclaredConstructor(参数类型.class,...)                获取特定的构造方法,包括私有构造方法

    父类和父接口                              含义
    getSuperclass()                             获取类的父类
    getInterfaces()                            获取类实现的接口

     查看Java编译class文件字节码命令: #javap -c filepath.class   --查看class文件字节码

  • 相关阅读:
    php 静态绑定
    overlaps the location of another project Zendstudio导入已经存在的目录
    12c debug 转 12C 连接CDB和PDB
    Statistics gathering and SQL Tuning Advisor
    shell 调试 2例
    专 linux命令之set x详解
    lock to deteck in oracle
    浏览器助手,请求拦截,后台模拟键鼠操作,页内嵌入JS
    WebBrowser控件的高级定制+mshtml
    创业者那些鲜为人知的事情
  • 原文地址:https://www.cnblogs.com/zengming/p/7507474.html
Copyright © 2020-2023  润新知