当前位置: 首页 > news >正文

深圳企业网站制作制作大连承接网站制作

深圳企业网站制作制作,大连承接网站制作,代做毕设要注册答疑网站,培训网站制作1,反射的定义 一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的,并且能够获得此类的引用。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作。 反射则是一开始并不知道我要初始化的类对象是…

1,反射的定义

一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的,并且能够获得此类的引用。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作。

反射则是一开始并不知道我要初始化的类对象是什么,自然也无法使用 new 关键字来创建对象了。这时候,我们使用 JDK 提供的反射 API 进行反射调用。反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。是Java被视为动态语言的关键。

Java反射机制主要提供了以下功能:

①在运行时构造任意一个类的对象

②在运行时获取或者修改任意一个类所具有的成员变量和方法

③在运行时调用任意一个对象的方法(属性)

2,Class

反射始于Class,Class是一个类,封装了当前对象所对应的类的信息。

一个类中有属性,方法,构造器等,比如说 有一个Person类,一个Order类,一个Book类,这些都是不同的类,现在需要一个类,用来描述类,这就是 Class,它应该有类名,属性,方法,构造器等。Class是用来描述类的类。

Class类是一个对象照镜子的结果,对象可以看到自己有哪些属性,方法,构造器,实现了哪些接口等等。对于每 个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。 对象只 能由系统建立对象,一个类(而不是一个对象)在 JVM 中只会有一个Class实例

2.1获取Class对象

获取Class对象的三种方式

①. 通过类名获取 类名.class

②. 通过对象获取 对象名.getClass()

③. 通过全类名获取 Class.forName(全类名) classLoader.loadClass(全类名)

例如获取People的Class对象:

public class People {private String name;private int 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;}
}

通过三种方式获取: 

//方式一 通过类名获取 类名.class
Class<People> peopleClass = People.class;//方式二 通过对象获取 对象名.getClass()
People people =new People();
Class<? extends People> peopleClass1 = people.getClass();//方式三 通过全类名获取 Class.forName(全类名) classLoader.loadClass(全类名)
try {Class<?> peopleClass2 = Class.forName("com.yuanzhen.People");
} catch (ClassNotFoundException e) {throw new RuntimeException(e);
}

方式一需要导入类的包,依赖太强,不导包就抛编译错误

方式二一般可以创建对象就不需要反射了

方式三最常用,没有依赖性

2.2判断是否为某个类的实例

//peopleClass 是否为People.class的实例
boolean assignableFrom = peopleClass.isAssignableFrom(People.class);

2.3创建实例

通过反射来生成对象主要有两种方式:

①使用Class对象的newInstance()方法来创建Class对象对应类的实例。

②先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建实例。这 种方法可以用指定的构造器构造类的实例。

例如:

//方式一 使用Class对象的newInstance()方法来创建Class对象对应类的实例
try {People people1 = peopleClass.newInstance();
} catch (IllegalAccessException e) {throw new RuntimeException(e);
} catch (InstantiationException e) {throw new RuntimeException(e);
}
//方式二 先通过Class对象获取指定的Constructor对象
//再调用Constructor对象的newInstance()方法来创建实例
//这种方法可以用指定的构造器构造类的实例
Constructor<People> constructor = null;
try {constructor = peopleClass.getConstructor(People.class);constructor.newInstance();
} catch (Exception e) {throw new RuntimeException(e);
}

3,构造器

上面提到了通过构造器可以创建对象,那么怎么获得构造器呢?

获得构造器的api:

Constructor getConstructor(Class[] params)获得使用特殊的参数类型的public构造函数(包括父类)
Constructor[] getConstructors()获得类的所有公共构造函数
Constructor getDeclaredConstructor(Class[] params)获得使用特定参数类型的构造函数(包括私有)
Constructor[] getDeclaredConstructors()获得类的所有构造函数(与接入级别无关)

例如:

public class People {public People(String name, int age) {this.name = name;this.age = age;}private People() {}public People(String name) {this.name = name;}
}
try {//获取Class对象Class<?> peopleClass = Class.forName("com.yuanzhen.People");//获得使用特殊的参数类型的public构造函数(包括父类)Constructor<?> constructor = peopleClass.getConstructor(String.class, int.class);//获得使用特定参数类型的构造函数(包括私有)constructor = peopleClass.getDeclaredConstructor();//获得类的所有公共构造函数Constructor<?>[] constructors = peopleClass.getConstructors();//获得类的所有构造函数(与接入级别无关)constructors = peopleClass.getDeclaredConstructors();
} catch (Exception e) {throw new RuntimeException(e);
}

4,成员变量

4.1获取成员变量

获取类的成员变量的api:

Field getField(String name)获得命名的公共字段
Field[] getFields()获得类的所有公共字段
Field getDeclaredField(String name)获得类声明的命名的字段
Field[] getDeclaredFields()获得类声明的所有字段

例如:

public class People {public String name;private int 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;}
}
try {//获取Class对象Class<?> peopleClass = Class.forName("com.yuanzhen.People");//获得命名的公共字段  nameField field = peopleClass.getField("name");//获得类声明的命名的字段(包括私有) ageField field1 = peopleClass.getDeclaredField("age");//获得类的所有公共字段Field[] fields = peopleClass.getFields();//获得类声明的所有字段Field[] fields1 = peopleClass.getDeclaredFields();
} catch (Exception e) {throw new RuntimeException(e);
}

4.2调用成员变量

将成员变量赋值:

try {//获取Class对象Class<?> peopleClass = Class.forName("com.yuanzhen.People");//获得命名的公共字段  nameField field = peopleClass.getField("name");//获得类声明的命名的字段(包括私有) ageField field1 = peopleClass.getDeclaredField("age");//创建对象Object people = peopleClass.newInstance();//暴力反射,解除私有限定field1.setAccessible(true);//将年龄设为20field1.set(people,20);//将姓名设为张三field.set(people,"张三");
} catch (Exception e) {throw new RuntimeException(e);
}

5,成员方法

5.1获取成员方法

获取方法信息的api:

Method getMethod(String name, Class[] params)使用特定的参数类型,获得命名的公共方法
Method[] getMethods()获得类的所有公共方法
Method getDeclaredMethod(String name, Class[] params)使用特写的参数类型,获得类声明的命名的方法
Method[] getDeclaredMethods()获得类声明的所有方法

例如:

public class People {public String name;private int age;private void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}private String getName() {return name;}public int getAge() {return age;}
}
try {//获取Class对象Class<?> peopleClass = Class.forName("com.yuanzhen.People");//使用特定的参数类型,获得命名的公共方法Method method = peopleClass.getMethod("setAge", int.class);//使用特写的参数类型,获得类声明的命名的方法(包括私有)Method method1 = peopleClass.getDeclaredMethod("setName", String.class);//获得类的所有公共方法Method[] methods = peopleClass.getMethods();//获得类声明的所有方法(包括私有)Method[] methods1 = peopleClass.getDeclaredMethods();} catch (Exception e) {throw new RuntimeException(e);
}

5.2调用成员方法

try {//获取Class对象Class<?> peopleClass = Class.forName("com.yuanzhen.People");//使用特定的参数类型,获得命名的公共方法Method method = peopleClass.getMethod("setAge", int.class);//使用特写的参数类型,获得类声明的命名的方法(包括私有)Method method1 = peopleClass.getDeclaredMethod("setName", String.class);//创建对象实例Object people = peopleClass.newInstance();//暴力反射,解除私有限定method.setAccessible(true);//调用方法setAgemethod.invoke(people,20);//调用方法 setNamemethod1.invoke(people,"张三");
} catch (Exception e) {throw new RuntimeException(e);
}

6,总结

反射的常规使用就是这些,本文主要是对常用反射api的记录总结。

http://www.yayakq.cn/news/974381/

相关文章:

  • 做网站找雷鸣北京专业seo公司
  • 上海微信网站制作哪家专业四川工程造价信息网
  • 佛山微网站建设报价教学互动网站开发背景
  • 培训网站建设方案说明书网站建设 昆山
  • 襄阳蒂凯网络网站建设小程序html设计简单校园网页代码
  • 平台网站模板素材图片wordpress 调用百度前端公众库
  • 兰州网站订制php网站后台模板下载
  • 孝感的网站建设佛山免费建站怎样
  • 网站建设 技术规范书河北住房和城乡建设厅网站卡
  • 佛山市城乡和住房建设局网站教育培训网站模板下载
  • asp在网站制作中的作用怎么修改网站源文件
  • 网站投放手机建站程序源码
  • 超酷网站甘肃园区网络搭建
  • 自己主机做网站服务器强大的技术团队网站建设
  • 网站建设策划书悠悠天津开发区建网站公司
  • 做pc端网站怎么样网页设计欣赏怎么做
  • 触屏版手机网站外国高端网站
  • 汽车html静态网站外贸网站哪个好
  • 做视频网站需要多大空间潍坊高级网站建设推广
  • 苏州网站建设营销q479185700刷屏郑州市网站
  • 做红包网站是犯法的吗如何在工信部网站注册
  • 新开元电销系统福州seo服务
  • 优秀的国外设计网站西安百度seo排名
  • 优秀企业展示网站百度搜索引擎怎么做
  • 专业的国内网站建设公司网站建设关于我们
  • 厦门网站建设厦门seo开发微信公众平台
  • 怎么提高网站浏览量山东大标网络
  • 外贸网站搭建公司郑州男科医院排名最好的医院
  • 旅游景区网站建设策划书wordpress中怎么去掉默认页面模板中的评论框
  • 新手做电商怎么做百度怎么优化排名