标签:数据 main 返回 nbsp 指示 get pre ssi 方法调用
static Class<?>
|
返回与带有给定字符串名的类或接口相关联的 Class 对象。 className--完整类名,eg:com.test.Test01 |
eg: Class clazz=Person.class;
eg:Class clazz=new Person().getClass();
Object类的getClass(类的完整类名)方法 |
读取配置文件,判断两个对象是否是同一个字节码文件 |
静态属性class(锁对象) |
当作静态方法的锁对象 |
Class类中静态方法forName() |
读取配置文件, 判断是否是同一个字节码对象 |
1 package com.heima.reflect; 2 import com.heima.bean.Person; 3 4 public class Demo1_Reflect { 5 6 /** 7 * @param args 8 * @throws ClassNotFoundException 9 */ 10 public static void main(String[] args) throws ClassNotFoundException { 11 Class clazz1 = Class.forName(""); 12 // 接口 a = 实现类的对象 a.方法 13 //方式一 14 Class clazz2 = Person.class; 15 //方式二 16 Person p = new Person(); 17 Class clazz3 = p.getClass(); 18 //方式三 19 System.out.println(clazz1 == clazz2); 20 System.out.println(clazz2 == clazz3); 21 } 22 23 }
1 package com.heima.reflect; 2 3 import java.io.BufferedReader; 4 import java.io.FileReader; 5 6 public class Demo2_Reflect { 7 8 /** 9 * * 榨汁机(Juicer)榨汁的案例 10 * 分别有水果(Fruit)苹果(Apple)香蕉(Banana)桔子(Orange)榨汁(squeeze) 11 * @throws IOException 12 */ 13 public static void main(String[] args) throws Exception { 14 Juicer j = new Juicer(); //创建榨汁机 15 //j.run(new Apple()); 16 //j.run(new Orange()); 17 BufferedReader br = new BufferedReader(new FileReader("config.properties"));//com.heima.reflect.Apple 18 Class clazz = Class.forName(br.readLine()); //获取该类的字节码文件 19 Fruit f = (Fruit) clazz.newInstance(); //创建实例对象 20 21 j.run(f); 22 } 23 } 24 interface Fruit { 25 public void squeeze(); 26 } 27 class Apple implements Fruit { 28 public void squeeze() { 29 System.out.println("榨出一杯苹果汁儿"); 30 } 31 } 32 33 class Orange implements Fruit { 34 public void squeeze() { 35 System.out.println("榨出一杯橘子汁儿"); 36 } 37 } 38 39 class Juicer { 40 /*public void run(Apple a) { 41 a.squeeze(); 42 } 43 44 public void run(Orange o) { 45 o.squeeze(); 46 }*/ 47 48 public void run(Fruit f) { 49 f.squeeze(); 50 } 51 52 }
创建此 Class 对象所表示的类的一个新实例。 |
|
getConstructor(Class<?>... parameterTypes) 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。 |
|
Constructor<?>[] |
返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。 |
getDeclaredConstructor(Class<?>... parameterTypes) 返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。 |
|
Constructor<?>[] |
返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。 |
返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。 |
|
Field[] |
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。 |
getDeclaredField(String name) 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。 |
|
Field[] |
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。 |
void |
setAccessible(boolean flag) 将此对象的 accessible 标志设置为指示的布尔值。 |
void |
将指定对象变量上此 Field 对象表示的字段设置为指定的新值。 |
getMethod(String name, Class<?>... parameterTypes) 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。 |
|
Method[] |
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。 |
getDeclaredMethod(String name, Class<?>... parameterTypes) 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。 |
|
Method[] |
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 |
1 package com.heima.test; 2 3 import java.lang.reflect.Method; 4 import java.util.ArrayList; 5 6 public class Test1 { 7 8 /** 9 * @param args 10 * ArrayList<Integer>的一个对象,在这个集合中添加一个字符串数据,如何实现呢? 11 * 泛型只在编译期有效,在运行期会被擦除掉 12 * @throws Exception 13 */ 14 public static void main(String[] args) throws Exception { 15 ArrayList<Integer> list = new ArrayList<>(); 16 list.add(111); 17 list.add(222); 18 19 Class clazz = Class.forName("java.util.ArrayList"); //获取字节码对象 20 Method m = clazz.getMethod("add", Object.class); //获取add方法 21 m.invoke(list, "abc"); 22 23 System.out.println(list); 24 25 } 26 27 }
static Object |
newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。 |
1 package com.heima.动态代理; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 6 public class MyInvocationHandler implements InvocationHandler { 7 private Object target; 8 9 public MyInvocationHandler(Object target) { 10 this.target = target; 11 } 12 @Override 13 public Object invoke(Object proxy, Method method, Object[] args) 14 throws Throwable { 15 System.out.println("权限校验"); 16 method.invoke(target, args); //执行被代理target对象的方法 17 System.out.println("日志记录"); 18 return null; 19 } 20 21 }
1 package com.heima.动态代理; 2 3 public interface Student { 4 public void login(); 5 6 public void submit(); 7 }
1 package com.heima.动态代理; 2 3 public class StudentImp implements Student { 4 5 @Override 6 public void login() { 7 System.out.println("登录"); 8 } 9 10 @Override 11 public void submit() { 12 System.out.println("提交"); 13 } 14 15 } User.java_代码示例 1 package com.heima.动态代理; 2 3 public interface User { 4 public void add(); 5 6 public void delete(); 7 } UserImp.java_代码示例 1 package com.heima.动态代理; 2 3 public class UserImp implements User { 4 5 @Override 6 public void add() { 7 //System.out.println("权限校验"); 8 System.out.println("添加功能"); 9 //System.out.println("日志记录"); 10 } 11 12 @Override 13 public void delete() { 14 //System.out.println("权限校验"); 15 System.out.println("删除功能"); 16 //System.out.println("日志记录"); 17 } 18 19 }
1 package com.heima.动态代理; 2 3 import java.lang.reflect.Proxy; 4 5 public class Test { 6 7 /** 8 * @param args 9 */ 10 public static void main(String[] args) { 11 /*UserImp ui = new UserImp(); 12 ui.add(); 13 ui.delete(); 14 15 System.out.println("-------------------------------");*/ 16 /* 17 * public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces, 18 * InvocationHandler h) 19 */ 20 /*MyInvocationHandler m = new MyInvocationHandler(ui); 21 User u = (User)Proxy.newProxyInstance(ui.getClass().getClassLoader(), ui.getClass().getInterfaces(), m); 22 u.add(); 23 u.delete();*/ 24 25 StudentImp si = new StudentImp(); 26 si.login(); 27 si.submit(); 28 System.out.println("-------------------------------"); 29 MyInvocationHandler m = new MyInvocationHandler(si); 30 Student s = (Student)Proxy.newProxyInstance(si.getClass().getClassLoader(), si.getClass().getInterfaces(), m); 31 32 s.login(); 33 s.submit(); 34 } 35 36 }
标签:数据 main 返回 nbsp 指示 get pre ssi 方法调用
原文地址:http://www.cnblogs.com/xxhz/p/7078546.html