黑马程序员──反射
来源:互联网 发布:开淘宝网店怎么弄客服 编辑:程序博客网 时间:2024/06/06 03:30
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
反射
得到Class 实例对象 -字节码的三种方式
<span style="font-size:12px;">public class GetClass {public static void main(String[] args) throws ClassNotFoundException {String s = "abc";Class cls1 = s.getClass();Class cls2 = String.class;Class cls3 = Class.forName("java.lang.String");//System.out.println(cls1==cls2);//System.out.println(cls2==cls3);Class cls4 = int.class;Class cls5 = Integer.class;//System.out.println(cls4==cls5);Class cls6 = void.class;//System.out.println(cls5.isPrimitive());System.out.println(boolean.class==Boolean.TYPE);}}</span>
<span style="color:#330033;">public class ConstructorDemo {public static void main(String[] args)throws Exception {//new String("abc"); Constructor cons = String.class.getConstructor(String.class); String str = (String)cons.newInstance("abc"); System.out.println(str); }}</span>
Field 代表的是字节码中的变量,不是具体对象上的变量。
变量必须是public修饰才行。
如果是默认权限(不能看见,可以访问),需要用getDeclaredField("name")来关联此字段,然后就可以get方法获取。
如果是private修饰(不能看见,不能访问)-->暴力反射!
public static void main(String[] args)throws Exception {ReflctPerson rp = new ReflctPerson(5,"haha");Field field = rp.getClass().getField("age");int age = (int)field.get(rp);//System.out.println(age);ReflctPerson rp1 = new ReflctPerson();Field field2 = rp1.getClass().getDeclaredField("name");field2.setAccessible(true); //对private属性强行访问,这就是暴力反射!String name = (String)field2.get(rp1);System.out.println(name);
练习:将一个对象中所有String类型的变量中的'b'变成'a'。
注意:Field有getType()方法,获取变量的声明类型。而且字节码比较用== 比较专业。
public static void main(String[] args)throws Exception {PersonString ps = new PersonString();System.out.println(ps);Field[] fields = ps.getClass().getFields();//获取所有字段for(Field field : fields)//高级for循环{if(field.getType()==String.class)//判断类型{String str = (String)field.get(ps);//获取变量//System.out.println(str);str = str.replace('b','a');//替换//System.out.println(str);field.set(ps, str);//设置变量}}System.out.println(ps);}
成员函数-->getMethod(String name, Class<?>... parameterTypes)
invoke(Object obj, Object... args)
如果invoke(null,object args)那么,这个方法是静态的!!!
invoke(null,new Object[] args) 1.4语法 会将数组拆开,里面的元素才是参数。
示例:
public static void main(String[] args)throws Exception {String s = "abc";Method me = s.getClass().getMethod("charAt", int.class);System.out.println(me.invoke(s, 2));}
MainReflctTest 用反射调用输入类名的main方法。 注意invoke(null,new Object[] args) 1.4语法 会将数组拆开,里面
的元素才是参数。可以通过外包Object[]或者(Object)声明是对象,不进行拆包。
public static void main(String[] args)throws Exception {String className = args[0];Method mainMethod = Class.forName(className).getMethod("main", String[].class);//mainMethod.invoke(null, new Object[]{new String[]{"aaa","bbb","ccc","wanan"}});mainMethod.invoke(null, (Object)new String[]{"aaa","bbb","ccc","wanan"});
具有相同维数和元素类型的数组属于同一类型,即具有相同的Class实例对象。
代表数组的Class实例对象的getSuperclass( )方法返回父类为Object类对应的Class。
static Object
get(Object array, int index)
static int
getLength(Object array)
示例:通过反射遍历数组private static void print(Object obj) {Class las = obj.getClass();if(las.isArray())//判断类型{int leng = Array.getLength(obj);//获取数组长度for(int i=0;i<leng;i++){System.out.println(Array.get(obj, i));//获取数组元素}
反射的作用-->实现框架功能
写框架的时候不知道要调用的类名,我们不能直接new对象,需要通过Class.forName()来操作,这就是反射的作用。
练习:对集合进行反射操作
类加载器加载文件 ClassLoader
InputStream fis = ColletionReflct.class.getResourceAsStream("My.properties");Properties pro = new Properties();pro.load(fis);fis.close();String className = (String)pro.get("className");Collection con = (Collection)Class.forName(className).newInstance();con.add("aaa");con.add("aaa");System.out.println(con.size());JavaBean介绍
JavaBean是一种特殊的Java类,主要用于传递数据信息。这种Java类中的方法主要用于访问私有的字段。而且方法名命名符合某种规则。
规则就是setXxx和getXxx。
通过JavaBean的方式来获取私有属性。
PropertyDescriptor类 和对应的Read和Write方法
public static void main(String[] args)throws Exception {ReflctPerson rp = new ReflctPerson();String propertyName = "name";PropertyDescriptor pd = new PropertyDescriptor(propertyName,rp.getClass());Method get = pd.getReadMethod();//获取get方法。Object retVal = get.invoke(rp);System.out.println(retVal);Method set = pd.getWriteMethod();//获取set方法。set.invoke(rp,"haha");System.out.println(rp.getName());
以上内容为本人笔记,仅供参考。
- 黑马程序员──反射
- 黑马程序员──反射
- 黑马程序员--java 反射
- 黑马程序员之反射
- 黑马程序员之反射
- 黑马程序员__java_反射
- 黑马程序员_反射
- 黑马程序员 反射
- 黑马程序员--Java反射
- 黑马程序员--反射
- 黑马程序员-java-反射
- 黑马程序员:反射技术
- 黑马程序员_java反射
- 黑马程序员---反射
- 黑马程序员-反射
- 黑马程序员---反射
- 黑马程序员_反射
- 黑马程序员_反射
- Ubuntu默认root密码
- Ambari系列(一):在离线环境中自动化安装Hadoop集群
- Foundation框架基础 NSString
- UI第六课
- FAT32学习笔记(三)文件的删除,目录的删除,FAT32表的用途,FsInfo的作用
- 黑马程序员──反射
- atitit.编程语言会形成进化树--哪些特性会繁荣??通才还是专才的选型 现代编程语言的特性总结
- foundation框架基础 NSMutableString 可变字符串
- 电力系统决策支持系统
- ListView中排序和分组(GroupTemplate)的使用实例演示
- 伸展树hdu4453(good)
- SQL总结(一)基本查询
- ios多态的感悟
- 文档处理 删除