java反射的常用方法调用(转载)
2018-01-23 17:37
483 查看
在开发过程中,有时候我们会遇到类名不确定(只有程序运行起来后才能获知类名)但需要调用类中的方法的情况,这时候调用方法就可以用到java的反射。
本文为转载,以作记录,侵删。
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
/**
* 反射机制获取类有三种方法
*/
@Test
public void testGetClass() throws ClassNotFoundException {
Class clazz = null;
//1 直接通过类名.Class的方式得到
clazz = Person.class;
System.out.println("通过类名: " + clazz);
//2 通过对象的getClass()方法获取,这个使用的少(一般是传的是Object,不知道是什么类型的时候才用)
Object obj = new Person();
clazz = obj.getClass();
System.out.println("通过getClass(): " + clazz);
//3 通过全类名获取,用的比较多,但可能抛出ClassNotFoundException异常
clazz = Class.forName("com.java.reflection.Person");
System.out.println("通过全类名获取: " + clazz);
}
本文为转载,以作记录,侵删。
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
/**
* 反射机制获取类有三种方法
*/
@Test
public void testGetClass() throws ClassNotFoundException {
Class clazz = null;
//1 直接通过类名.Class的方式得到
clazz = Person.class;
System.out.println("通过类名: " + clazz);
//2 通过对象的getClass()方法获取,这个使用的少(一般是传的是Object,不知道是什么类型的时候才用)
Object obj = new Person();
clazz = obj.getClass();
System.out.println("通过getClass(): " + clazz);
//3 通过全类名获取,用的比较多,但可能抛出ClassNotFoundException异常
clazz = Class.forName("com.java.reflection.Person");
System.out.println("通过全类名获取: " + clazz);
}
/** * Class类的newInstance()方法,创建类的一个对象。 */ @Test public void testNewInstance() throws ClassNotFoundException, IllegalAccessException, InstantiationException { Class clazz = Class.forName("com.java.reflection.Person"); //使用Class类的newInstance()方法创建类的一个对象 //实际调用的类的那个 无参数的构造器(这就是为什么写的类的时候,要写一个无参数的构造器,就是给反射用的) //一般的,一个类若声明了带参数的构造器,也要声明一个无参数的构造器 Object obj = clazz.newInstance(); System.out.println(obj); }
@Test public void testGetResourceAsStream() throws ClassNotFoundException, IOException { // 这么写的话,文件需要放到src目录下 // InputStream in = new FileInputStream("test.properties"); //5、关于类加载器的一个主要方法 //调用getResourceAsStream 获取类路径下的文件对应的输入流 InputStream in = this.getClass().getClassLoader() .getResourceAsStream("com/java/reflection/test.properties"); System.out.println("in: " +in); Properties properties = new Properties(); properties.load(in); String driverClass = properties.getProperty("dirver"); String jdbcUrl = properties.getProperty("jdbcUrl"); //中文可能会出现乱码,需要转换一下 String user = new String(properties.getProperty("user").getBytes("ISO-8859-1"), "UTF-8"); String password = properties.getProperty("password"); System.out.println("diverClass: "+driverClass); System.out.println("user: " + user); }
@Test public void testMethod() throws 4000 ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException { Class clazz = Class.forName("com.java.reflection.Person"); //1、得到clazz 对应的类中有哪些方法,不能获取private方法 Method[] methods =clazz.getMethods(); System.out.print(" getMethods: "); for (Method method : methods){ System.out.print(method.getName() + ", "); } //2、获取所有的方法(且只获取当着类声明的方法,包括private方法) Method[] methods2 = clazz.getDeclaredMethods(); System.out.print("\ngetDeclaredMethods: "); for (Method method : methods2){ System.out.print(method.getName() + ", "); } //3、获取指定的方法 Method method = clazz.getDeclaredMethod("setName",String.class);//第一个参数是方法名,后面的是方法里的参数 System.out.println("\nmethod : " + method); Method method2 = clazz.getDeclaredMethod("setName",String.class ,int.class);//第一个参数是方法名,后面的是方法里的参数 System.out.println("method2: " + method2); //4、执行方法! Object obj = clazz.newInstance(); method2.invoke(obj, "changwen", 22); }
相关文章推荐
- Java反射常用方法
- JavaScript调用java方法——dwr步骤(有的地方是转载地)
- java 常用的反射方法
- java反射调用配置文件构造类对象,使用其方法
- [Java] - 通过反射调用对象的方法
- 通过Java反射调用方法
- JAVA 反射之方法调用
- 利用java反射解决 Android系统方法不能调用的情况
- 居于反射机制Java动态调用jar方法
- replace和replaceAll是JAVA中常用的替换字符的方法(转载)
- java反射中两种方法的不同(反射能否实现对类的私有方法的调用)
- Java 反射进行动态方法调用
- Java反射之调用构造方法and操作数组
- 一个小java反射程序,简单的调用方法。
- Java获取各种常用时间方法(转载)
- 【转】java的反射机制中的动态代理代理(二)--在远程方法调用中运用代理类
- 通过Java反射调用方法
- java 反射入门-属性方法调用实例
- 有关java通过反射机制调用类中自有方法的问题
- java 反射入门-属性方法调用实例