1、代理对象
侵入式修改:直接在原来的代码上进行修改
代理:无侵入式的修改代码
代理的作用:让某一类做自己专业的事,其他繁杂的琐事交给代理去做,先定义接口,接口里是要代理的方法,编写一个类实现该接口,这个类只做专业的事,再编写一个类也实现这个接口,在代理的方法中调用专业的类的方法
创建代理对象:
演示:
public class Test {
public static void main(String[] args) {
//获取代理对象
BigStar bigStar = new BigStar("张三");
Star proxy = ProxyUtil.createProxy(bigStar);
//调用对象方法
String result = proxy.sing("曾经你说");
System.out.println(result);
proxy.dance();
}
}
public interface Star {
String sing(String singName);
void dance();
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyUtil {
public static Star createProxy(BigStar bigStar){
Star star = (Star) Proxy.newProxyInstance(
ProxyUtil.class.getClassLoader(),
new Class[]{Star.class},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//参数1:代理对象
//参数2:要运行的方法
//参数3:调用方法时传递的实参
if ("sing".equals(method.getName())){
System.out.println("准备话筒,收钱");
}else if ("dance".equals(method.getName())){
System.out.println("准备场地,收钱");
}
return method.invoke(bigStar,args);
}
}
);
return star;
}
}
public class BigStar implements Star {
private String name;
@Override
public String sing(String singName){
System.out.println(this.name+"正在唱"+singName);
return "谢谢";
}
@Override
public void dance(){
System.out.println(this.name+"正在跳舞");
}
public BigStar(String name) {
this.name = name;
}
}
2、反射-获取class对象的方式
反射:可以获取类中的成员变量,成员方法,构造方法,并对其进行编程访问
反射获取class对象的三种方式:
(1)Class.forName(“全类名”):常用
(2)类名.class:更多的是作为参数进行传递
(3)对象.getclass():需要有对象时才可以使用
演示:
public class GetClass {
public static void main(String[] args) throws ClassNotFoundException {
//方法1:Class.forName("全类名");
Class clazz1 = Class.forName("反射.获取class的方式.Student");
System.out.println("clazz1:"+clazz1);
//方法2:类名.class
Class clazz2 = Student.class;
System.out.println("clazz2:"+clazz2);
//方法3:对象.getclass()
Student student = new Student();
Class clazz3 = student.getClass();
System.out.println("clazz3:"+student);
System.out.println("clazz3 == clazz2:"+(clazz3 == clazz2));
System.out.println("clazz1 == clazz2:"+(clazz1 == clazz2));
System.out.println("clazz1 == clazz3:"+(clazz1 == clazz3));
}
}
执行结果如下:
clazz1:class 反射.获取class的方式.Student
clazz2:class 反射.获取class的方式.Student
clazz3:反射.获取class的方式.Student@140e19d
clazz3 == clazz2:true
clazz1 == clazz2:true
clazz1 == clazz3:true
3、反射获取构造方法
(1)Class类中用于获取构造方法的方法
① Constructor<?>[] getConstructors():返回所有公共(public修饰)构造方法对象的数组
② Constructor<?>[] getDeclaredConstructors():返回所有构造方法对象的数组
③ constructor<T> getConstructor(<Class<?>…parameterTypes):返回单个公共构造方法对象
④ constructor<T> getDeclaredConstructor(<Class<?>…parameterTypes):返回单个构造方法对象
(2)Constructor类中用于创建对象的方法
① T newInstance(Object … initargs):根据指定的构造方法创建对象
② setAccessible(boolean flag):设置为true,表示取消访问检查
演示:
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;
public class GetConstructors {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Class clazz = Class.forName("反射.获取class的方式.Student");
Constructor[] cons1 = clazz.getConstructors();
for (Constructor cons : cons1){
System.out.println(cons);
}
System.out.println("=================================");
Constructor[] cons2 = clazz.getDeclaredConstructors();
for (Constructor cons : cons2){
System.out.println(cons);
}
System.out.println("=================================");
Constructor con1 = clazz.getDeclaredConstructor();
System.out.println(con1);
System.out.println("=================================");
Constructor con2 = clazz.getDeclaredConstructor(String.class);
System.out.println(con2);
System.out.println("=================================");
Constructor con3 = clazz.getDeclaredConstructor(int.class);
System.out.println(con3);
System.out.println("=================================");
Constructor con4 = clazz.getDeclaredConstructor(String.class,int.class);
System.out.println(con4);
//获取权限修饰符
int modifier = con4.getModifiers();
//public对应1,private对应2,protected对应4
System.out.println(modifier);
//获取参数
Parameter[] parameters = con4.getParameters();
for (Parameter parameter : parameters){
System.out.println(parameter);
}
con4.setAccessible(true);
Student stu = (Student) con4.newInstance("张三",23);
System.out.println(stu);
}
}
public class Student {
private String name;
private int age;
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;
}
public Student() {
}
protected Student(String name, int age) {
this.name = name;
this.age = age;
}
protected Student(String name) {
this.name = name;
}
private Student(int age) {
this.age = age;
}
}
运行结果如下:
public 反射.获取class的方式.Student()
=================================
private 反射.获取class的方式.Student(int)
protected 反射.获取class的方式.Student(java.lang.String)
protected 反射.获取class的方式.Student(java.lang.String,int)
public 反射.获取class的方式.Student()
=================================
public 反射.获取class的方式.Student()
=================================
protected 反射.获取class的方式.Student(java.lang.String)
=================================
private 反射.获取class的方式.Student(int)
=================================
protected 反射.获取class的方式.Student(java.lang.String,int)
4
java.lang.String arg0
int arg1
反射.获取class的方式.Student@140e19d