• Java的反射机制


    1. 什么是Java的反射?

    java的反射机制是在编译时并不确定是哪个类被加载了,而是在程序运行的时候才加载、探知、自审。使用的是在编译期并不知道的类。这样的编译特点就是java反射。

    2. Class

    使用Java反射机制就得使用java.lang.Class 这个类。当一个类被加载以后,Java虚拟机就会自动产生一个Class对象。通过这个Class对象我们就能获得加载到虚拟机当中这个Class对象对应的方法、成员以及构造方法的声明和定义等信息。

    3.如何利用反射API在运行的时候知道一个类的信息呢?

    让我们通过以下的代码示例:

    package com.lovo.exercise02;
    /**
    *牌类
    */
    public
    class Card { private int playerNumber;//玩家人数 private int cardNumber;//每个人的牌的张数 private String[] huase = { "红桃", "黑桃", "方块", "梅花" }; private String[] paivalue = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" }; private List<String> cards;//代表52张牌 /**
    *带两个参的构造器
    */
    public Card(int playerNumber, int cardNumber) { super(); this.playerNumber = playerNumber; this.cardNumber = cardNumber; cards = new ArrayList<String>(); for (String hs : huase) { for (String pv : paivalue) { cards.add(hs + pv); } } } /**
    *获取牌的张数
    */
    public List<String> getCards(){ return this.cards; } /**
    *洗牌
    */
    public void xipai(){ Collections.shuffle(cards); } /**
    *发牌
    */
    public void fapai(){ System.out.println("牌:" + cards.size()); List<String> subList = cards.subList(0, cardNumber); for (String card : subList) { System.out.println(card); } subList.clear(); } }

    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;

    /**
    *测试类
    */
    public
    class Test { public static void main(String[] args) throws Exception { // 加载com.lovo.exercise02.Card Class clazz = Class.forName("com.lovo.exercise02.Card"); // System.out.println(clazz.getName()); // System.out.println(clazz.getPackage()); // 创建对象 // Object obj = clazz.newInstance(); // 调用无参构造方法创建对象 Constructor constructor = clazz.getConstructor(int.class, int.class);//调用有参构造方法 Object obj = constructor.newInstance(3, 17); // 调用方法 xipai fapai // Method xipai = clazz.getMethod("xipai"); // xipai.invoke(obj); // Method fapai = clazz.getMethod("fapai"); // fapai.invoke(obj); Method display = clazz.getMethod("display", int.class, String.class); Object result = display.invoke(obj, 5, "abc"); System.out.println(result); // 获取构造器 // Constructor[] constructors = clazz.getDeclaredConstructors(); // for (Constructor constructor : constructors) { // System.out.print(constructor.getName() + "("); // Class[] types = constructor.getParameterTypes(); // for (Class class1 : types) { // System.out.print(class1.getName() + ","); // } // System.out.println(")"); // } // 获取字段 // Field[] fields = clazz.getDeclaredFields(); // for (Field field : fields) { // System.out.println(field.getType().getName() + " " + // field.getName()); // } // 获取public方法 // Method[] methods = clazz.getMethods(); // Method[] methods = clazz.getDeclaredMethods(); // for (Method method : methods) { // System.out.print(Modifier.toString(method.getModifiers()) + " " + // method.getReturnType().getName() + " " + method.getName() + "("); // Class[] parameterTypes = method.getParameterTypes(); // for (Class class1 : parameterTypes) { // System.out.print(class1.getName() + ","); // } // System.out.println(")"); // } } }
  • 相关阅读:
    开发金额处理BigDecimal
    Strtuts2.3.15 bug ,可以远程执行命令
    java 获取properies资源信息
    获取程序运行所在ip
    JVM虚拟机内存和String 类型深入
    数据库表结构上下文
    properties配置文件实现DBManager
    查询功能的包装类
    通过反射生成类的utils
    jdbc反射操作
  • 原文地址:https://www.cnblogs.com/g398429959/p/4436385.html
Copyright © 2020-2023  润新知