【Java】 Java的反射机制概述及方法介绍

反射基石 Class类


java类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则是由这个类的实例对象来确定的,不同的实例对象有不同的属性。Java程序中的各个java类,它们是否属于同一个类,是不是可以用一个类来描述这类事物呢?这个类的名字就是Class,要主要与小写class关键字的区别。Class类描述了哪些方面的信息呢?类的名字,类的访问属性,类所属于的包名,字段名称的列表、方法名称的列表,等等。学习反射,首先就要明白Class这个类


java程序中各个java类同属于一类事物,描述这类事物的java类名就是class
对比提问:众多的人用一个什么类表示?众多的Java类用一个什么类表示?
人---->person
java类---->class


类名.class.例如System.class
对象.getClass(),例如new Date().getClass()


CLass.forName("类名")  例如Class.forName("java.util.Date")//forName 作用返回字节码




反射就是把java类中的各种成分映射成相应的java类,例如,一个java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的java类来表示,就想汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示java类的class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field,Method,Contructor,Package等等。




Constructor类
得到某个类所有的构造方法:
例子:Constructor constructors[]=
Class.forName("java.lang.String"),getConstructors();
得到某一个构造方法:
例子 Constructor constructor=
Class.forName("java.lang.String")getConstructor(StringBuffer.class)
//new String(new StringBuffer("abc"));
Constructor constructor1=String.class.getConstructor(StringBuffer.class)//得要方法的时候需要类型
String str2=(String)constructor1.newInstsance(new StringBuffer("abc"));//调用获得的方法
System.out.println(str2.CharAt(2));


Class.newinstance()方法
例子 String obj=(String)Class.forName("java.lang.String").newInstance();
该方法内部先得到默认构造方法,然后用该构造方法创建实例对象。


Filed类代表某一个类中的一个成员变量


public class Reflectpoint
{
private int x;
public int y;


public Reflectpoint(int x,int y)
 {
 super();
 this.x=x;
 this.y=y;
 }
}
Reflectpoint pt1=new Reflectpoint(3,5)
Field fieldY = pt1.getClass().getField("y");//不代表具体的值
//fieldY的值是多少?是5,错 FieldY不是对象身上的变量,而是类上,要用它去取某个对象上对应的值
System.out.println(fieldY.get(pt1));
Field fieldX = pt1.getClass().getDeclared("x");
fieldX.setAccessible(ture);
System.out,println(fieldX.get(pt1))




Method类
Method类代表某个类中的一个成员方法
通常方式,System.out.println(Str.charAt(1));
反射方式,System.out.println(charAt.invoke(str,1));
如果传递给Method对象的invoke()方法的第一个参数为null,说明该Method对象对应的是一个静态方法




//str1.charAt(1);
Method methosCharAt=String.class.getMethod("ChatAt",int.class)
System.out.println(methosCharAt.invoke(str,1));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小涵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值