黑马程序员---反射,Class类,Method类,Field类,数组参数的成员方法
2012-06-13 23:40
489 查看
---------------------- android培训、java培训、期待与您交流! ----------------------
反射的基石——Class
如何得到字节码文件的实例对象?
有三种方式:
类名.class 如:System.class
对象.getClass() 如:new Date().getClass();
Class.forName(" 类名") 如:Class.forName(" java.util.Date");
代码:
数组类型的Class实例对象:
Class.isArray();
System.out.println(int[].class.isArray());//true
反射:
就是把java中的各种成分映射成相应的java类。
一个类中的组成成分:成员变量,方法,构造方法,包等信息,也用一个个的java类来表示。
一个类中的的每个成员都已用相应的反射API类的一个实力对象来表示,通过调用Class累的方法可以得到这些实例对象后,得到实例对象后怎么用是学习反射的要点.
Constructor类代表某个类的一个构造方法。
得到某个类的所有构造方法:
Constructor[] constructor = Class.forName("java.lang.String").getConstructor();
得到某一个构造方法:
Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);//得到StringBuffer类的构造函数
实例对象:
普通方式:String str = new String( new StringBuffer("abc"));
反射方式:
Constructor constructor = String.class.getConstructor(StringBuffer.class);
String str = (String)constructor.newInstance(new StringBuffer("abc"));
Filed 类
Filed 类代表某个类中的一个成员变量。
利用反射获取String 类型的成员变量后,修改字符串中的字符。
Method类
代表某个类中的一个成员方法
得到类中的一个方法:
如:Class.forName("java.lang.String").getMethod("charAt",int.class)
调用方法:
ü 普通方式:
由str对象来调用,str.charAt(1);
ü 反射方式:
Method m =String.class.getMethod("charAt", int.class);
System.out.println(m.invoke(str1, 1));//为str1这个对象调用charAt方法参数为1,打印“r”,Str1 这个对象要用静态修饰。
如果invoke方法的第一个参数为null ,表示该Method对象对应的是一个静态方法。
(重点理解)接受数组参数的成员方法进行反射:
打印结果:
hncu
nihao
---------------------- android培训、java培训、期待与您交流! ----------------------
反射的基石——Class
如何得到字节码文件的实例对象?
有三种方式:
类名.class 如:System.class
对象.getClass() 如:new Date().getClass();
Class.forName(" 类名") 如:Class.forName(" java.util.Date");
代码:
package com.hncu.day1; import java.util.Date; public class GetClass { public static void main(String[] args) throws Exception{ Class c1 = Date.class;//Date类的字节码文件 他是一个Class类型的实例对象, GetClass gc = new GetClass(); gc.getClass(); System.out.println(gc.getClass()); System.out.println(c1); System.out.println(Class.forName("com.hncu.day1.GetClass")); } }
数组类型的Class实例对象:
Class.isArray();
System.out.println(int[].class.isArray());//true
反射:
就是把java中的各种成分映射成相应的java类。
一个类中的组成成分:成员变量,方法,构造方法,包等信息,也用一个个的java类来表示。
一个类中的的每个成员都已用相应的反射API类的一个实力对象来表示,通过调用Class累的方法可以得到这些实例对象后,得到实例对象后怎么用是学习反射的要点.
Constructor类代表某个类的一个构造方法。
得到某个类的所有构造方法:
Constructor[] constructor = Class.forName("java.lang.String").getConstructor();
得到某一个构造方法:
Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);//得到StringBuffer类的构造函数
实例对象:
普通方式:String str = new String( new StringBuffer("abc"));
反射方式:
Constructor constructor = String.class.getConstructor(StringBuffer.class);
String str = (String)constructor.newInstance(new StringBuffer("abc"));
Filed 类
Filed 类代表某个类中的一个成员变量。
import java.lang.reflect.Field; public class ReflectDemo { private int x; public int y; public ReflectDemo(int x, int y) { this.x = x; this.y = y; } public static void main(String[] args) throws Exception { ReflectDemo rd = new ReflectDemo(3, 8); ReflectDemo rd1 = new ReflectDemo(4, 9); Field fieldX = rd.getClass().getDeclaredField("x");// 得到类中私有x的定义。 Field fieldY = rd.getClass().getField("y");// 得到类中y的定义。 System.out.println(fieldY.get(rd));// 得到rd对象y的值 System.out.println(fieldY.get(rd1));// 得到rd1对象的y值 fieldX.setAccessible(true);// 将fieldX设置为可见。 System.out.println(fieldX.get(rd));// 得到rd对象中x的值 } }
利用反射获取String 类型的成员变量后,修改字符串中的字符。
import java.lang.reflect.Field; public class ReflectDemo { Private String str1 = "reflect"; Private String str2 = "reflectdemo"; public static void main(String[] args) throws Exception { ReflectDemo rd = new ReflectDemo(); changeValue(rd); } private static void changeValue(Object obj) throws Exception { Field[] fields = obj.getClass().getDeclaredFields();//获取所有定义的成员变量 for (Field field : fields) { if (field.getType() == String.class) {// 字节码使用== 使用的是一份字节码 String oldValue = (String) field.get(obj); String newValue = oldValue.replace('r', 'R'); field.set(obj, newValue); } } System.out.println(obj); } // 重写toString方法 public String toString() { return str1 + " " + str2; } }
Method类
代表某个类中的一个成员方法
得到类中的一个方法:
如:Class.forName("java.lang.String").getMethod("charAt",int.class)
调用方法:
ü 普通方式:
由str对象来调用,str.charAt(1);
ü 反射方式:
Method m =String.class.getMethod("charAt", int.class);
System.out.println(m.invoke(str1, 1));//为str1这个对象调用charAt方法参数为1,打印“r”,Str1 这个对象要用静态修饰。
如果invoke方法的第一个参数为null ,表示该Method对象对应的是一个静态方法。
(重点理解)接受数组参数的成员方法进行反射:
import java.lang.reflect.Method; public class ReflectDemo2 { public static void main(String[] args) throws Exception { String startClassName = args[0]; Method mainMethod = Class.forName(startClassName).getMethod("main", String[].class); mainMethod.invoke(null,new Object[]{new String[]{"hncu","nihao"}}); //ReflectTest.maint(new String[]{"dkj","kdfj"}); } } class ReflectTest { public static void main(String[] args) { for(String s : args) { System.out.println(s); } } }
打印结果:
hncu
nihao
---------------------- android培训、java培训、期待与您交流! ----------------------
相关文章推荐
- 黑马程序员--03.反射--07【含有数组参数的成员方法的反射】【数组的反射】
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
- 黑马程序员-博客 (10) 反射(基石class类、Constructor类、Field类、Method类、数组的反射、HashCode的分析)
- 黑马程序员------反射的深入学习(No.1)(Class类、Constructor类、Field类、Method类、数组的反射)
- 黑马程序员_基础加强_对接收数组参数的成员方法进行反射
- 对接收数组参数的成员方法进行反射.avi
- 对接收数组参数的成员方法进行反射
- 反射(二)Class类,Method类,Field类,反射获得带参数的对象
- 23对接收数组参数的成员方法进行反射24 数组与Object的关系及其反射类型25 数组的反射应用
- 反射学习--对接收数组参数的成员方法进行反射
- 黑马程序员—反射调用main方法的问题总结(涉及可变参数)(反射参数是一个数组的函数要小心)
- 黑马程序员——Java高新技术——反射(续)、成员方法的反射、数组的反射、Hashcode方法分析、类加载器等
- 对接收数组参数的成员方法进行反射——Method的一个demo
- 黑马程序员---成员方法的反射(Method类)
- java反射之Class类、构造器、方法、字段、数组
- 有数组参数的方法的反射调用
- 黑马程序员——Java基础---反射Class类、Constructor类、Field类
- 黑马程序员-Class类, Constructor类,Field类, Method类的小总结
- wrong number of arguments,java方法反射时数组参数的坑