Java反射

1.反射机制

反射三种实现方式:
在这里插入图片描述

package day27;

import day17.Person;

public class Dk1Reflect {

	//反射
	public static void main(String[] args) throws ClassNotFoundException {
		//第一种方式
		Class clazz1 = Class.forName("day17.Person");
		//第二种方式字节码对象
		Class clazz2 = Person.class;
		//第三种方式对象反向获取
		Person p = new Person();
		Class clazz3 = p.getClass();
		//三种方式返回的是同一个字节码文件
		System.out.println(clazz1 == clazz2);    //结果为true
		System.out.println(clazz2 == clazz3);    //结果为true
	}

}

package day27;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import day17.Person;

public class Dk2Reflect {

	//配置文件代替原来的多态调用
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Juicer j = new Juicer();
//		j.run(new Apple());
//		j.run(new Orange());
		
		BufferedReader br = new BufferedReader(new FileReader("config.properties"));
		Class<?> clazz = Class.forName(br.readLine());
		Fruit a = (Fruit)clazz.newInstance();            //创建该类的对象。通过类空参的构造
		j.run(a);         //配置文件是苹果,输出是榨苹果汁
		//如果没有空参构造,就会抛出异常
		//通过有参构造创建对象,config.properties改为Person类
		Constructor<?> c = clazz.getConstructor(String.class,int.class);
		Person p = (Person)c.newInstance("张三",23);
		System.out.println(p);
		Field f = clazz.getField("name");
		f.set(p, "李四");
		System.out.println(p);//输出异常,因为name属性是私有的
		//使用暴力获取字段
		Field f2 = clazz.getDeclaredField("name");
		f2.setAccessible(true);          //去掉访问权限
		f2.set(p, "李四");
		System.out.println(p);//输出正常.李四,23
		//获取方法
		Method m = clazz.getMethod("eat");     //获取eat()方法
		m.invoke(p);                           //执行eat()方法
		Method m2 = clazz.getMethod("eat",int.class);     //获取eat()方法有参
		m.invoke(p,10);                                   //执行eat()方法有参
		
	}

}

interface Fruit{
	
	public void squeeze();
} 

class Apple implements Fruit{

	@Override
	public void squeeze() {
		System.out.println("榨出苹果汁");
	}
}

class Orange implements Fruit{

	@Override
	public void squeeze() {
		System.out.println("榨出橘子汁");
	}
}

class Juicer{
	public void run(Fruit f) {
		f.squeeze();
	}
}

2.动态代理

动态代理:本来自己做的事,请别人来做

在程序运行过程中产生对象,通过反射产生一个代理

只能针对接口做代理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值