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(")"); // } } }
原文地址:https://www.cnblogs.com/g398429959/p/4436385.html