java 反射机制
来源:互联网 发布:电子政务系统源码 编辑:程序博客网 时间:2024/06/05 15:55
java 反射机制
Note:
1. 正常方式:引入需要的“包.类” —> 通过new实例化 —> 取得实例化对象
2. 反射方式:实例化对象 —> getClass()得到类 —> 得到完整的“包.类”名称
Class类的常用方法
(1)三种方法得到某个特定的类
1.使用Class.forName(String className)
得到,也是推荐的
Class<?> clazz1= Class.forName("org.apache.vlis.Agent");
2.使用某一个对象 X ,调用对象方法getClass()
得到
Father father = new Father();Class<?> clazz2 = father.getClass();
3.使用某一个类Class得到
Class<?> clazz3 = Father.class;
(2)通过在(1)得到了某个特定的类,接下来要实例化对象
1.通过使用newInstance()
方法
Note:
newInstance()
方法,需要实例化的类必须有无参的构造函数
Class<?> clazz = Class.forName("org.apache.vlis.Father");//类Father,必须有无参的构造函数Father father = (Father) clazz.newInstance();
2.通过使用getConstructors()
方法得到有参构造函数
Class<?> clazz = Class.forname("org.apache.vlis.Father");Constructor<?> constructors[] = clazz.getConstructors();Father father = (Father) constructors[index].newInstance("fatherName",47);
3.Constructor常用方法
(3)通过在(1)中得到了某个特定的类,然后得到具体的方法,在使用invoke(…)方法执行
- Method 类中常用方法
基础Class
package vlis;public class Thinking{ private String name; public void setName(String Name){ this.name = Name; } public String getName(){ return this.name; } public Thinking(){ } public void Print(){ System.out.println("thinking_fioa") } public static void Println(String op,String name){ System.out.println("thinking_fioa " +op+" "+name"; }}
1.反射调用多参的静态方法(public)
package vlis;public class Client{ public static void main(String [] args){ try{ Class<?> clazz = Class.forName("vlis.Thinking"); Method print = clazz.getMethod("Print",new Class[]{String.class,String.class}); print.invoke(null,new Object[] { " love "," fyj"}); }catch(Exception e){ e.printStackTrace(); } }}
2.反射调用非静态方法(public)
package vlis;public class Client{ public static void main(String [] args){ try{ Class<?> clazz = Class.forName("vlis.Thinking"); Thinking thinking = (Thinking) clazz.newIntance();//Thinking类中一定要有无参构造函数 Method print = clazz.getMethod("Print",new Class[]{String.class,String.class}); print.invoke(thinking,new Object[] { " love "," fyj"}); }catch(Exception e){ e.printStackTrace(); } }}
3.反射调用非静态方法无参函数
package vlis;public class Client{ public static void main(String [] args){ try{ Class<?> clazz = Class.forName("vlis.Thinking"); Thinking thinking = (Thinking) clazz.newIntance();//Thinking类中一定要有无参构造函数 Method print = clazz.getMethod("Print"); print.invoke(thinking); }catch(Exception e){ e.printStackTrace(); } }}
4.封装setXXX(…),getXXX(…),使反射得到的对象可以操作具体的属性
Note:如果类中有多个属性时,另写一个setter(…),getter(…)操作方法
- 基础类Father
package vlis;public class Father { private String name; private int age; public void setName(String name){ this.name = name; } public String getName(){ return this.name; } public void setAge(int Age){ this.age = Age; } public int getAge(){ return this.age; } public void Print(){ System.out.println("thinking_fioa"); } public Father(){ }}
- Client类
package vlis;public class Client{ public static void main(String [] args){ Class<?> clazz = null; try{ clazz = Class.forName("vlis.Father"); }catch(Exception e){ e.printStackTrace(); } Object obj = clazz.newInstance(); setter(obj,"setName","thinking_fioa",String.class); System.out.println(" ---> " + getter(obj,"getName")); setter(obj,"setAge",5,int.class); System.out.println(" ---> "+ getter(obj,"getAge")); } //setter(...)方法中,需要加入一个参数:Class<?> type,否则,处理int,double,float,不行. public static void setter(Object obj,String methodName,Object value,Class<?> type){ try{ Method method= obj.getClass().getMethod(methodName,type); method.invoke(obj,value); }catch(Exception e){ e.printStackTrace(); } } public static Object getter(Object obj,String methodName){ try{ Method method = obj.getClass().getMethod(methodName); return method.invoke(obj) }catch(Exception e){ e.printStackTrace(); } return null; }}
(4)通过在(1)中得到了某个特定的类,然后得到具体的Field(Field就是值属性,区别出:Filed[] getFields(),Field[] getDeclaredFields())
- Filed类常用的方法
1. 虽然在反射中可以使用类的getXXX(),setXXX(…),修改属性。但比较麻烦,也可能类并没有提供。可以采用直接操作Filed域,也更简单
//下面的代码中出现的类Father,是(3).4中所指的Father类public class CLient{ public static void main(String [] args){ Class<?> clazz = null; try{ clazz = Class.forName("vlis.Father"); }catch(Exception e){ e.printStackTrace(); } Object obj = clazz.newInstance(); Field nameField = clazz.getDeclaredField("name"); //name是private,设置其可以访问 nameField.setAccessible(true); nameField.set(obj,"thinking_fioa"); System.out.println(nameField.get(obj)); }}
(5)通过反射来操作数组
- Array(java.lang.reflect.Array)类常用的方法
Note:特别提醒:对于一个数组来说,想要得到
Class<?> type
需要使用array.getClass().getComponentType();
public class Client { public static void main(String args[]) throws Exception{ int temp[] = {1,2,3}; Class<?> clazz = temp.getClass().getComponentType(); System.out.println("thinking_fioa ---> " + clazz.getName()); Array.set(temp, 2, 4); System.out.println("thinking_fioa --->" + Array.get(temp, 2)); }}
0 0
- 【反射】JAVA反射机制
- 【Java】JAVA反射机制
- Java 反射机制[Field反射]
- Java 反射机制[Method反射]
- Java反射机制笔记-反射机制
- java的反射机制
- Java的反射机制
- java反射机制详解!
- Java反射机制
- Java的反射机制
- java 反射机制--侯捷
- java反射机制
- java反射机制
- [候捷]Java反射机制
- java 反射机制
- java 反射机制初探
- 关于Java反射机制
- java反射机制
- HPU 1723: 感恩节KK专场——陪学妹上课【规律】
- 按钮ui
- 详解Linux内核红黑树算法的实现 http://blog.csdn.net/npy_lp/article/details/7420689
- 百度附近功能 定位
- hdu5592
- java 反射机制
- Ubuntu 14.04中修复默认启用HDMI后没有声音的问题
- 基于Wolf32F031 自由评估板的Buzzer(PWM控制方式)实验硬件原理及软件API使用方法(适用于STM32F030/031)
- malloc源码分析---3
- 【Github教程】史上最全github使用方法:github入门到精通
- LightOJ 1079 - Just another Robbery (01背包)
- Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead.
- 迷宫的最短路径 -- BFS
- 基于Wolf32F031 自由评估板的ADC实验硬件原理及软件API使用方法(适用于STM32F030/031)