package com.hawkol.reflex_class;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class Test {
//1.java的反射
//2.Class
自描述类(描述当前对象自己的一个类,通过该类可以获得类的属性和方法,(包括私有属性和构造方法)
public static void main(String[] args) throws Exception
{
getClass1();
getClass2();
getClass3();
System.out.println("---------------------------------");
Person person=new Person();
//设置基于配置的松耦合的程序
BufferedReader br=new BufferedReader(new
FileReader("e:\\discount.txt"));
String string=br.readLine();
Class cls=Class.forName(string);
person.buy((Discount)cls.newInstance());
printConstructor(Person.class);
getField(Person.class);
setField(Person.class);
}
private static void setField(Class cls) {
try {
//private 字段的赋值和获取
//Field f1=cls.getField("pid");
Field f1=cls.getDeclaredField("pid");//获得私有字段
f1.setAccessible(true);//如果没有这一句会抛出异常
Object object=cls.newInstance();
f1.set(object, 1);
System.out.println(f1.get(object));
//public 字段的赋值和获取
Field f2=cls.getField("name");
f2.set(object,"hawkol");
System.out.println(f2.get(object));
} catch (Exception e) {
e.printStackTrace();
}
}
//字段的反射
static void getField(Class cls){
Field [] fields=cls.getDeclaredFields();
for(Field f:fields){
System.out.println(f);
System.out.println("修饰符:"+Modifier.toString(f.getModifiers()));
System.out.println("类型:"+f.getType());
System.out.println("名称:"+f.getName());
}
}
//构造方法反射
static void printConstructor(Class cls){
//3.得到所有构造函数
Constructor []cs =cls.getDeclaredConstructors();
for(Constructor c:cs){
System.out.println(c);
System.out.println("修饰符:"+Modifier.toString(c.getModifiers()));
System.out.print("参数:");
Class []pt=c.getParameterTypes();
for(Class p:pt){
System.out.print(p.getName()+" ");
}
System.out.println();
}
//2.得到有参构造函数
//1.得到无参构造函数
}
//3.Class里面有一个静态方法Class.forName("") 类全名(包名+类名)
static void getClass3(){
try {
Class
class1=Class.forName("com.hawkol.reflex_class.Person");
System.out.println("Run getClass3:"+class1.getName());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//2.通过.class属性
static void getClass2(){
Class class1=Person.class;
System.out.println("Run getClass2:"+class1.getName());
}
//1.获得Class对象的方法 Object有一个方法,getClass;
static void getClass1() throws Exception{
Person person=new Person();
Class class1=person.getClass();
System.out.println("Run getClass1:"+class1.getName());
}
}
class Person{
private int pid;
public String name;
protected int age;
private double price=200;
public Person(int pid, String name, int age) {
super();
this.pid = pid;
this.name = name;
this.age = age;
System.out.println("Person2()");
}
public Person() {
super();
System.out.println("Person1()");
}
public void buy(Discount d){
System.out.println("原价:"+price);
System.out.println("折扣:"+d.discount());
System.out.println("卖价:"+price*d.discount()/100);
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
本文深入探讨Java反射机制的应用,包括如何使用反射获取类的属性和方法、实例化对象及调用方法等。通过具体示例介绍了反射在设置字段值、获取构造方法等方面的作用。

被折叠的 条评论
为什么被折叠?



