定义一个产品类Card,私有字段,私有方法
java
package redgo.beans;
public class Card {
private String brand; //车的品牌
private String num; //车号
private String color; //车的颜色
public Card(){
brand = "大众";
num = "Gk0661";
color = "红色";
}
public Card(String brand, String num, String color){
this.brand = brand;
this.num = num;
this.color = color;
}
void setColor(String color){ //设置颜色
this.color = color;
}
private void fix(){
System.out.println("开始修车");
report();
}
private void report(){
System.out.println("报告:修车完毕");
}
@Override
public String toString() {
return "Card [brand=" + brand + ", num=" + num + ", color=" + color + "]";
}
}
下面测试如何调用当前运行类,指定类对象及其内部字段、构造方法、方法等
java
package redgo.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import redgo.beans.Card;
public class CardReflect {
public static void main(String[] args) throws Exception{
System.out.println("-------获取Card类--------\n");
Class c = Class.forName("redgo.beans.Card"); //根据包名+类名获取类对象
Card card = (Card)c.newInstance(); //用默认构造方法创建对象
Method[] method = c.getDeclaredMethods(); //获取类声明的所有方法,不包括继承得来的
Field[] field = c.getDeclaredFields(); //获取类声明的所有字段
Constructor[] constructor = c.getDeclaredConstructors(); //获取类声明的所有构造方法
System.out.println(">>运行类对象声明的fix()方法");
Method fix_method = c.getDeclaredMethod("fix");
fix_method.setAccessible(true); //允许调用private方法
fix_method.invoke(c.newInstance());//第一个参数为类的实例
System.out.println(">>运行结束\n");
System.out.println(">>利用指定构造方法创建对象");
Constructor con = c.getConstructor(String.class, String.class, String.class);
Card card_another = (Card)con.newInstance("奔驰", "JK897", "蓝色");
System.out.println(card_another.toString());
System.out.println(">>创建对象完毕\n");
System.out.println("-------获取当前类--------");
System.out.println("getClassForStatic()方法输出结果:" + getClassForStatic().getName());
System.out.println("getClassNameForStatic()方法输出结果:" + getClassNameForStatic());
}
/**
* 利用匿名类在静态方法中获取当前类,弥补静态方法中不能用this.getClass()的不足
*/
private static Class getClassForStatic() {
return new Object(){
public Class getClassForStatic(){
return this.getClass();
}
}.getClassForStatic();
}
/**
* 利用匿名类静态方法获取当前类名
*/
private static String getClassNameForStatic(){
return new Object(){
public String getClassNameForStatic(){
String className = this.getClass().getName();
return className.substring(0, className.lastIndexOf('$'));
}
}.getClassNameForStatic();
}
}
输出结果
——-获取Card类——–
>>运行类对象声明的fix()方法
开始修车
报告:修车完毕
>>运行结束
>>利用指定构造方法创建对象
Card [brand=奔驰, num=JK897, color=蓝色]
>>创建对象完毕
——-获取当前类——–
getClassForStatic()方法输出结果:redgo.test.CardReflect$1
getClassNameForStatic()方法输出结果:redgo.test.CardReflect