Java反射基础应用
2015-05-20 09:18
218 查看
类定义:
package test; public class Car { private int year; private String name; private float price; /** * 无参构造器 */ public Car() { super(); } /** * 一个参数的构造器 * @param name */ public Car(String name){ super(); this.name = name; } /** * 多个参数的构造器 * @param year * @param name * @param price */ public Car(int year, String name, float price) { super(); this.year = year; this.name = name; this.price = price; } @Override public String toString() { return "Car [year=" + year + ", name=" + name + ", price=" + price + "]"; } /** * 私有方法 * @return */ private void testPrivate(){ } /** * protected方法 * @return */ protected void testProtect(){ } public void testInvoke(int i,String str){ System.out.println("测试testInvoke成功:"+i+","+str); } public int getYear() { return year; } public void setYear(int year) { this.year = year; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } }
反射应用:
package test; import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 反射 * @author Administrator * */ public class Invoke { public static void main(String[] args) throws Exception { System.out.println("*********无参构造器*********"); Car car = (Car)noParaCreateInstance(Car.class); car.setName("maibahe"); System.out.println(car); System.out.println("*********一个参数构造器*********"); Car car2 = (Car)createInstanceByPara(Car.class,"benchi"); System.out.println(car2.toString()); System.out.println("*********多个个参数构造器*********"); Car car3 = (Car)createInstanceByParas(Car.class, 5, "kaidilake", (float) 56.70); System.out.println(car3.toString()); System.out.println("***********通过反射的方式获取方法*************"); invoke1(car3); System.out.println("***********通过反射的方式获取方法的另一种方式*************"); invoke2(Car.class); System.out.println("***********通过反射的方式调用方法*************"); invoke3(car3); System.out.println("***********直接通过已知方法名以反射的方式获取方法,再以反射的方式调用方法*************"); invoke4(car3); System.out.println("***********通过反射的方式获取属性名*************"); invokeField(car3); } /** * 对于无参的构造器通过反射的方式获取实例 * @param clazz * @return * @throws Exception */ public static Object noParaCreateInstance(Class clazz) throws Exception{ Object object = clazz.newInstance(); return object; } /** * 有一个参数的构造器通过反射的方式获取实例 * @param clazz * @param name * @return * @throws Exception */ public static Object createInstanceByPara(Class clazz,String name) throws Exception{ Constructor con = clazz.getConstructor(String.class); Object object = con.newInstance(name); return object; } /** * 多个参数的构造器通过反射方式获取实例,并且参数的顺序也要和构造器的参数的顺序一致 * @param clazz * @param year * @param name * @param price * @return * @throws Exception */ public static Object createInstanceByParas(Class clazz,int year,String name,float price) throws Exception{ Constructor con = clazz.getConstructor(int.class,String.class,float.class); Object object = con.newInstance(year,name,price); return object; } /** * 通过反射的方式获取方法 * @param obj * @throws InvocationTargetException * @throws IllegalAccessException * @throws IllegalArgumentException */ public static void invoke1(Object obj) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{ //获取当前类(不包括父类)的所有方法(包括private方法和protected方法) Method[] methods = obj.getClass().getDeclaredMethods(); //获取当前类以及其父类的所有方法(不包括private方法和protected方法) methods = obj.getClass().getMethods(); for(Method m:methods){ System.out.println(m.getName()); // if("testInvoke".equals(m.getName())){ // m.invoke(obj, null); // } } } /** * 通过反射的方式获取方法的另一种方式,直接传递一个.class参数 * @param clazz */ public static void invoke2(Class clazz){ //获取当前类(不包括父类)的所有方法(包括private方法和protected方法) Method[] methods = clazz.getDeclaredMethods(); //获取当前类以及其父类的所有方法(不包括private方法和protected方法) methods = clazz.getMethods(); for(Method m:methods){ System.out.println(m.getName()); } } /** * 通过反射的方式调用方法 * @param obj * @throws IllegalArgumentException * @throws IllegalAccessException * @throws InvocationTargetException */ public static void invoke3(Object obj) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{ //获取当前类(不包括父类)的所有方法(包括private方法和protected方法) Method[] methods = obj.getClass().getDeclaredMethods(); //获取当前类以及其父类的所有方法(不包括private方法和protected方法) methods = obj.getClass().getMethods(); for(Method m:methods){ if("testInvoke".equals(m.getName())){ //通过反射的方式调用方法:m就是方法,即:方法.invoke(obj,para),方法调用方法自己 // m.invoke(obj, null);如果方法无参数则为null m.invoke(obj, 3,"good");//如果方法有多个参数,则用逗号隔开 } } } /** * 直接通过已知方法名以反射的方式获取方法,再以反射的方式调用方法 * @param obj * @throws SecurityException * @throws NoSuchMethodException * @throws IllegalArgumentException * @throws IllegalAccessException * @throws InvocationTargetException */ public static void invoke4(Object obj) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{ Method method = obj.getClass().getMethod("testInvoke", int.class,String.class);//若方法无参数则第二个参数用null代替 method.invoke(obj, 5,"fuck"); } /** * 以反射的方式获取属性 * @param obj * @throws Exception */ public static void invokeField(Object obj) throws Exception{ //获取当前类(不包括父类)的所有属性(包括private属性和protected属性) Field[] fields = obj.getClass().getDeclaredFields(); //获取当前类以及其父类的所有属性(不包括private属性和protected属性) fields = obj.getClass().getFields(); for(Field f:fields){ System.out.println(f.getName()); } } /** * 通过反射的方式获取类似于"@Override"这类东西 * @param obj * @throws Exception */ public static void invokeAnnotation(Object obj) throws Exception{ Annotation[] annotations = obj.getClass().getAnnotations(); } }
相关文章推荐
- Java基础---Java---基础加强---内省的简单运用、注解的定义与反射调用、 自定义注解及其应用、泛型及泛型的高级应用、泛型集合的综合
- 【JAVA - 基础】之反射的原理与应用
- java反射基础知识(五)反射应用实践
- Java基础笔记-反射及应用
- 黑马程序员_java基础反射类型与应用2
- 黑马程序员-----java基础二十一(java之反射技术应用(代理))
- 【JAVA - 基础】之反射的原理与应用
- 0025 Java 动态代理(反射的应用)【基础】
- 【Java基础】——应用配置文件的反射
- java基础巩固系列(四):数组的反射应用
- [零基础学JAVA]Java SE应用部分-36.反射机制与工厂设计模式 推荐
- 黑马程序员_java基础反射的类型与应用
- (Java基础--反射)构造方法的反射应用
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.2 相关Java基础知识 类装载器 反射机制
- java反射基础应用
- JAVA基础学习之IP简述使用、反射、正则表达式操作、网络爬虫、可变参数、了解和入门注解的应用、使用Eclipse的Debug功能(7)
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.2 相关Java基础知识 类装载器 反射机制
- java5核心基础泛型(2):泛型在反射中的应用