《黑马程序员》java反射复习
来源:互联网 发布:大数据技术应用难吗 编辑:程序博客网 时间:2024/05/01 10:03
反射就是把java类中各种成分映射成相应的java类。例如,一个java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的java类。表示java类的Class类显然要提供一系列的方法,来获取其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应的类德实例对象来表示,它们是Field、Method、Contructor、Package等等。
个人观点:反射就是通过操作类的字节码得到相应的对象的各种成分,然后进行相应的操作。
实例代码:
首先先定义一个共反射类操作的类:
public class Bean {private int age;public String name;public String str1="ball";public String str2="baskball";public String str3="football";public Bean(int age, String name) {super();this.age = age;this.name = name;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Bean other = (Bean) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn str1+" : "+str2+" : "+str3;}}
上面其实就是一个简单的类,下面就让我们用反射来操作上面的类:
import java.lang.reflect.Field;import java.lang.reflect.Method;import com.itcast.testBean.Bean;public class Test2 {/** * @param args * @throws NoSuchFieldException * @throws SecurityException * @throws IllegalAccessException * @throws IllegalArgumentException */public static void main(String[] args) throws Exception{// TODO Auto-generated method stubBean b = new Bean(20, "sps");Field field=b.getClass().getField("name");//注意:此时只是得到了class文件中的field,并没有赋予具体的值System.out.print(field.get(b));//用field的get传入具体的对像,才能得到具体的对象的field对应的值注意:得不到private的值//Field field2=b.getClass().getField("age");//注意:age 的field是private的(报错NoSuchFieldException)//System.out.print(field2.get(b));//用field的get传入具体的对像,才能得到具体的对象的field对应的值注意:得不到private的值Field field2=b.getClass().getDeclaredField("age");//此方法得到所有的声明成员变量//System.out.println(field2.get(b));//此方法报错说是此变量是私有的。field2.setAccessible(true);//暴力得到私有变量System.out.println(field2.get(b));setNew(b);System.out.println(b);Method method=String.class.getMethod("charAt", int.class);//得到string的charAt方法System.out.println(method.invoke(new String("abc"), new Object[]{2}));;//动态调用charAt方法(需要调用的对象及其传入的参数)//invoke 方法如果是静态的时,第一个参数可以传入null例如invoke(null,new object[]{2})}/** * 动态改变原来类中的已经定义的成员对象的赋值,并赋予新的值 * @param obj * @throws Exception */public static void setNew(Object obj) throws Exception{Field[] fields=obj.getClass().getFields();for(Field field:fields){if(field.getType()==String.class){String oldStr=(String)field.get(obj);String newStr=oldStr.replace('b', 'a');field.set(obj, newStr);}}}}
上面分别用反射来操作Bean类中的数据,并进行输出测试。最后那个setNew方法利用反射将一个对象中所有的的String变量中b的值替换为a,并重新赋予相应的变量。
- 《黑马程序员》java反射复习
- 黑马程序员——java复习总结——反射
- 黑马程序员——java基础 反射 (复习)
- 黑马程序员--java 反射
- 黑马程序员--Java反射
- 黑马程序员-java-反射
- 黑马程序员--java反射
- 黑马程序员-Java反射
- 【黑马程序员】java反射
- 黑马程序员-java反射
- 黑马程序员----Java反射
- 黑马程序员--------java 反射
- 黑马程序员JAVA---反射
- 黑马程序员----java----反射
- “黑马程序员”Java反射
- 黑马程序员--JAVA<反射>
- 黑马程序员--Java反射
- 黑马程序员-java-反射
- 安装magento时网页显示500错误
- 关于 AndroidManifest.xml
- 世界上主要BIOS厂家介绍(Phoenix,AMI,Insyde,Byosoft)
- JEditorPane和JTextPane学习总结
- 《悟透JavaScript》学习札记五之奇妙的对象
- 《黑马程序员》java反射复习
- 字节序
- Linux中断实现方法(三):中断处理模型
- MFC一天一练 --- 基本绘图操作
- flex fileReference的上传下载
- magento的模板安装
- Android中Message机制的灵活应用
- 要买还未买的书单——持续更新
- SSH视频学习笔记