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