java的反射实现_hawkol_新浪博客

本文深入探讨Java反射机制的应用,包括如何使用反射获取类的属性和方法、实例化对象及调用方法等。通过具体示例介绍了反射在设置字段值、获取构造方法等方面的作用。
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;
}
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值