关闭

黑马程序员_关于反射的学习心得

218人阅读 评论(0) 收藏 举报

----------android培训java培训、期待与您交流! ----------

反射是通过一个类的相关信息诸如类名,实例对象,等来获取类中的方法和元素的一种方法。

要想使用反射 就要先获取到Class对象 获取Class对象有三种方式

第一种:类名.class

第二种:具体对象.getClass();

第三种:Class.forName("类所在的包+类名");

第一种方式的具体实现(类名.class):

         比如要获取String的Class对象 就写成String.class;

Class cls=String.class;

第二种方式的具体实现(具体对象.getClass()

        获取String的Class对象

String str="abc";
Class cls=str.getClass();

第三种方式的具体实现(Class.forName("类所在的包+类名")
       获取String的Class对象

Class cls=Class.forName("java.lang.String");
以上三种方式 第三种最为常见。

获取到Class对象以后就可以对Class对象所属的类进行各种操作

通过Class对象可以获取到以下类型的对象

Field                   表示对象中定义的变量

Method              表示对象中的一般方法

Contructor        表示对象中的构造方法

因为每个变量或者方法都有private public 或默认的修饰符修饰 单纯用的获取方式只能得到被public所修饰的元素

所以一般都会用带有Declared的方法

获取对象中的元素一般都有两种方式 一种是获取单个 另一种是获取全部

关于Field

           获取全部Field(Field[] fld=cls.getDeclaredFilds();)

          获取单个Field(Field fld=cls.geDeclaredFild("变量名");)

关于Contructor

          获取全部Contructor(Contructor[] con=cls.getDeclaredContructors();)

           获取单个Contructor(Contructor con=cls.getDeclaredContructor(参数类型.class...);)

关于Method

         获取全部Method(Method[] mtd=cls.getDeclaredMethods();)

         获取单个Method(Method mtd=cls.getDeclaredMethod("方法名",参数类型.class))

获取到某个类的Class对象 并用这个Class对象获取到这个类中的各个元素以后 就可以对元素进行操作

Filed 主要有get方法和set方法

Contructor 可以用newInstance方法 利用获取到的构造函数来创建一个新的实例对象

Method invoke 可以直接调用这个类中定义的方法

以上的各种操作 只有当元素为public时 才可以进行 如果元素的访问状态为默认 或者为private时 需要使用setAccessible(boolean)改变元素的访问状态 才可以进行

 

 

以上的关于反射的各种描述 用下面这个例子来展示 

建立一个person类

package com.itheima;

public class person {
	private String name;
	private int age;
	person(String name,int age){
		this.name=name;
		this.age=age;
	}
	public void setName(String name){
		this.name=name;
	}
	public void setAge(int age){
		this.age=age;
	}
	public String getName(){
		return name;
	}
	public int getAge(){
		return age;
	}
}

一个test类 其中囊括了上面描述的各种方法的使用

package com.itheima;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class test {
	public static void main(String[] args)throws Exception{
		//通过forName的方法来创建person类的Class对象
		Class cl=Class.forName("com.itheima.person");
		//获取person类的构造方法
		Constructor con=cl.getDeclaredConstructor(String.class,int.class);
		//使用获取到的构造方法创建一个person的实例对象
		person p=(person)con.newInstance("张三",20);
		//打印新建的对象中的值来查看是否创建成功
		System.out.println(p.getName());
		//获取person类中的一般方法
		Method m=cl.getDeclaredMethod("setName",String.class);
		//使用获取到的一般方法来给新建的对象中的变量重新赋值
		m.invoke(p, "李四");
		//再次打印对象中的值 来查看重新赋值是否成功
		System.out.println(p.getName());
		//获取person类中的变量
		Field f=cl.getDeclaredField("age");
		//因为该变量是私有的 所以要先改变该变量的访问性
		f.setAccessible(true);
		//给该变量重新赋值
		f.set(p, 40);
		//打印新建person对象中的变量值 来查看是否修改成功
		System.out.println(p.getAge());
	}
}
 

小插曲:

               看张孝祥老师的反射教程 然后自己动手敲代码

               当代码中写到这么一句

               Constructor con=cl.getDeclaredConstructor(String.class,int.class);

               eclipse总是报错 但是看张老师的视频中 并没有报错的现象 百思不得其解

               然后百度 百度说 该这么写

               Constructor con=cl.getDeclaredConstructor(new Object(){String.class,int.class});

               不明所以 就在eclipse中如此这般的加上了new Object() 果然不报错了

               然后又写到这么一行

               person p=(person)con.newInstance("张三",20);

               ecilpse再次报错 参照上面的解决方式 就自己把这行代码改成了

	person p=(person)con.newInstance(new Object(){"张三",20});

                eclipse仍然报错 实在找不到原因 再次百度

               百度无果

               苦思了一下午

               突然想到 张老师视频中所说的关于eclipse javac的版本问题

               点开eclipse的Project——>Properties——>Java Compiler

               我去!这玩意啥时候变1.4了??

              果断改回1.6

               eclipse终于不报错了。。

 

 

----------android培训java培训、期待与您交流! ----------

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4912次
    • 积分:211
    • 等级:
    • 排名:千里之外
    • 原创:17篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档