因为java中基本数据类型不是面向对象的,
java对所有的数据类型都提供了对应的类封装了该数据类型的一些操作
int -----> Integer
byte----->Byte
short---->Short
long---->Long
boolean---->Boolean
char---->Character
float--->Float
double--->Double
反射--->把java类的组成成分映射成java的类
面向对象里面,万事万物皆对象
(java中类中静态的成员不是面向对象的
java中基本的数据类型不是面向对象)
那么类也是对象!类是哪个类的对象?有一个类叫Class,
所有的类都是Class的对象,这个对象我们如何用代码来表达呢?
比如有class A{}
A类本身有实例对象 A a1 = new A();
A类本身也是实例对象---->A类的字节码对象--->如何表示
只要用到Class类就用到了反射技术。
为什么要用反射---->很多流行的框架,一个半成品,然后去调用你写的东西,就能使用了
那么当框架产生的时候,我们可能还没学编程呢,框架怎么能调用到我写的东西呢
只能通过动态加载类来通过编译,将来你的功能实现了,我就直接可以调用到,既然要用动态
加载就要用到Class肯定要用到反射
1.Class类的一些常用方法
有了类的字节码对象,可以获取该类的所有信息
练习1:写一个Session类,在该类中添加一个方法
void printClassMessage(Object obj)
打印obj对象所属的类的所有public的方法
,包含方法的返回值类型,方法名称,参数类型列表
所有的自己声明的成员变量,包括成员变量的名称和类型
2.方法的反射java.lang.Method
如何获取某一个方法---->方法名称和参数类型列表
1.方法的反射
如何获取一个方法对象--->方法名称,参数列表
练习1
在Session类中添加一个方法
public void changePropertyValue
(String propertyName Object obj)
obj是一个标准JavaBean的对象
如果propertName
属性是字符串类型转换大写输出,
如果propertyName是整型属性+100后输出
如User类有如下属性
String username, int age
那么
User user = new User("zhangsan",30);
changePropertyValue("username",user)--->打印ZHANGSAN
changePropertyValue("age",user)--->打印130
2.成员变量的反射
如何获取成员变量 getField(成员变量的名称)
field.get(obj) field.set(obj,value)
构造函数的反射(用的不多)
如何获取构造函数
如果通过构造函数对象直接创建类的实体对象
数组的反射
封装类
Integer Byte Short Long Character Boolean
Double Float
自动的装箱和拆箱操作
数组是一个对象--->引用类型
练习1 对print方法进行反射操作
作业1
写一个方法changeValue(Object obj)
把obj对象的所有字符串属性值都变成大写
把obj对象的所有整型属性值都+100
通过方法的反射去完成 obj对象是标准JavaBean的对象
如User(username,userage)
User u = new User("zhangsan",30);
chageValue(u)
u.getUsername=====>"ZHANGSAN"
u.getUserage=====>130
作业2
class A{
private String name;
private int age
public A(){}
public A(String name,int age)
{
this.name = name;
this.age = age;
}
}
打印该类的构造函数声明
并通过每个构造函数的反射来创建对象
作业3
class B
{
public static void print(String[] s,int[] a)
{
对string拼接打印
对a数组求和打印
}
}
通过print方法的反射来操作该方法