Java反射初级阶段

反射初级阶段:

一.总共三个特点:getConstructors()获取构造函数

getMethods()获取普通自己写的方法

getField(“id”)获取属性

二.获取字节码对象(class)三种方法

方式一:Class clazz = Class.forName("flect.Person");

方式二:Class clazz =Person.class;

方式三:new Person(1,"1212").getClass();

三:三个特点的详细方法

一.获取构造函数的详细方法

1.getConstructors() 获取所有的公有方法

2.getDeclaredConstructors() 获取所有的方法,包括 私有和公有

3.Constructor c=getDeclaredConstructor(属性类型.class,属性类型.class)获取私有的单一方法

4.创建对象 c.newInstance(110,"123");如果构造方法c为私有,必须加上权限c.setAccessible(true);

二.获取普通函数的详细方法

1.getMethods() 返回一个包含某些 Method 对象的数组

2.getMethod("方法名", 类型.class,类型.class);返回该方法的Method对象,只能用于公有方法

3.getDeclaredMethod("方法名", 类型.class); 可返回私有方法的Method对象

4.method.invoke(“对象名”, “method方法的传递参数值”); 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。 如果该方法是私有的,必须加入调用权限method.setAccessible(true);

三.获取属性的详细方法

1.getFields();返回一个包含某些 Field 对象的数组,仅仅只包含公有属性

2.class.getField(“属性名”);返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。

3.class.getDeclaredFields(“属性名”); 返回一个 Field 对象.可包含私有属性

4.field.set(“对象p”,”值”);为对象p的field属性设置一个值

四:详细案例

1.获取构造函数

//方式一

Class clazz=Class.forName("flect.Person");

System.out.println(clazz);

//方式二

Class clazz2=Person.class;

System.out.println("clazz2:"+clazz2);

//方式三

Class clazz=new Person(11,"1212").getClass();

//得到公有

//Constructor constrs[]=clazz.getConstructors();

Constructor constrs[]=clazz.getDeclaredConstructors();

//Constructor c=clazz.getDeclaredConstructor(int.class,String.class);

//如果是私有。就必须加上权限

/*c.setAccessible(true);

Person p=(Person) c.newInstance(110,"123");

System.out.println(p.id+":"+p.name);*/

for(Constructor c:constrs)

{

System.out.println(c);

}

2.获取普通函数方法

Class clazz=Person.class;

Method methods[]=clazz.getMethods();

for(Method m:methods)

{

System.out.println(m);

}

Person p=new Person(123,"33");

Method method=clazz.getMethod("eat", int.class,int.class);

method.invoke(p, 3,5);

Method method2=clazz.getDeclaredMethod("sleep", int.class);

method2.setAccessible(true);

method2.invoke(p, 5);

3.获取属性方法

Person p=FactoryNewInstances.createPerson();

Field field[]=p.getClass().getFields();

for(Field f:field)

{

System.out.println(f);

}

Field fid=p.getClass().getField("id");

fid.set(p, 3);

Field fname=p.getClass().getField("name");

fname.set(p, "小布");

五:其它补充知识

1.创建一个object.properties文件,用于访问外部文件,做一个工厂类型。其中大致内容为:obj_url=flect.Personid=007name=tiger

访问方式为://通过读取配置文件,利用反射来创建一个对象

Properties pro = new Properties();

try { pro.load(FactoryNewInstances.class.getResourceAsStream("/object.properties"));

String objUrl = pro.getProperty("obj_url");

id = pro.getProperty("id");

name = pro.getProperty("name");

} catch (Exception e) {

e.printStackTrace();

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值