反射和动态实例化

反射和动态实例化

反射

  • 个人理解:在我们面向对象编程时,有时候需要我们对类这个对象进行操作,需要识别对象和类的信息,所以Java为我们提供了两种方式:第一种是传统的RTTI,它假定我们在编译时已经知道了所有的类型信息;另一种是反射机制,它允许我们在运行时发现和使用类的信息。

  • 在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中

     1)Class类:代表一个类
    
     2)Field 类:代表类的成员变量(属性)
    
     3)Method类:代表类的成员方法
    
     4)Constructor 类:代表类的构造方法
    
     5)Array类:提供了动态创建数组,以及访问数组的元素的静态方法
    

第一种方式、Class类

package com.gaoji.reflex;

import org.apache.tomcat.jni.User;

/** * 反射机制 * 获取正在运行的类的方法 * 我的理解:反射机制就是以类为对象, * 将这个类的方法行为作为对象的参数去使用它, * 可以理解为对封装好的类进行再封装或调用的一种思想。 * * 反射是为了动态代理做准备的 * @author Administrator * */
public class reflexdDome_01 {
   
   public static void main(String[] args) {
   
       Class c1 = null;
       Class<?> c2 = null;
       Class<?> c3 = null;
       Class<?> c4 = null;
       
       //如何获取正在运行中的类的对象
       //第一个方法:使用对象的getClass方法
       //不常用
       User u=new User();
       c1=u.getClass();
       
       
       //第二种:使用Class的静态方法forName,将类加载到内存中,并且获取class对象
       //常用,jdbc链接数据时,注册驱动使用的就是该方法
       try {
   
               c2=Class.forName("com.gaoji.reflex.User");//需要该类的全路径
               System.out.println(c2);
       } catch (ClassNotFoundException e) {
   
               // TODO Auto-generated catch block
               e.printStackTrace();
       }
       
       //第三种使用类.class语法
       
       c3=User.class;
       System.out.println(c3);
       
       //第四种:基本数据类型的封装类型。type语法
       c4=Integer.TYPE;
       System.out.println(c4);
       
       
   }

}

第二种方式

  • p.java 父类
package com.gaoji.reflex;

public class p {
   
    public int dome;

    public int getDome() {
   
        return dome;
    }

    public void setDome(int dome) {
   
        this.dome = dome;
    }
}
  • User.java 子类
package com.gaoji.reflex;
import java.io.Serializable;
public class User extends p{

private int id;
private String name;
public char sex;
private transient String phone;
public User(int id, String name, char sex, String phone) {

super();
this.id = id;
this.name = name;
this.sex = sex;
this.phone = phone;
}
User(int id, String name) {

super();
this.id = id;
this.name = name;
}
public User(int id) {

super();
this.id = id;
}
public User() {

super();
}
public int getId() {

return id;
}
public void setId(int id) {

this.id = id;
}
public String getName() {

return name;
}
public void introduce() {

System.out.println("this is uesr");
}
public void setName(String name) {

this.name = name;
}
public char getSex() {

return sex;
}
public void setSex(char sex) {

this.sex = sex;
}
public String getPhone() {

return phone;
}
public void setPhone(String phone) {

this.phone = phone;
}
@Override
public String toString() {

return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", phone=" + phone + "]";
}
}
  • 运行类
package com.gaoji.reflex;
//获取正在运行中的类的属性
import java.lang.reflect.Field;
public class reflexdDoem_03 {

public static void main(String[] args) throws NoSuchFieldException, SecurityException {

Class<?> c = null;
User u = new User();
c=u.getClass();
//获取指定的属性
/*Field f = c.getDeclaredField("name"); System.out.println(f.toGenericString());*/
//获取指定共有的属性
/*Field f = c.getField("sex"); System.out.println(f.toGenericString());*/
//获取类的所有属性
/*Field[] f = c.getDeclaredFields(); for (Field field : f) { System.out.println(field.getName()); }*/
//获取类的所有共有的属性
/*Field[] f = c.getFields(); for (Field field : f) { System.out.println(field.getName()); }*/
//getFields可以显示父类继承过来的属性
//getDeclaredFields不可以显示父类继承过来的属性
Field[] f = c.getDeclaredFields();
for (Field field : f) {

System.out.println(field.getName());
}
}
}

动态实例化

是一种不通过new的方式来实例化对象

  • User.java 用户实体类
package com.gaoji.reflex;
import java.io.Serializable;
public class User extends p{

private int id;
private String name;
public char sex;
private transient String phone;
public User(int id, String name, char sex, String phone) {

super();
this.id = id;
this.name = name;
this.sex = sex;
this.phone = phone;
}
User(int id, String name) {

super();
this.id = id;
this.name = name;
}
public User(int id) {

super();
this.id = id;
}
public User() {

super();
}
public int getId() {

return id;
}
public void setId(int id) {

this.id = id;
}
public String getName() {

return name;
}
public void introduce() {

System.out.println("this is uesr");
}
public void setName(String name) {

this.name = name;
}
public char getSex() {

return sex;
}
public void setSex(char sex) {

this.sex = sex;
}
public String getPhone() {

return phone;
}
public void setPhone(String phone) {

this.phone = phone;
}
@Override
public String toString() {

return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", phone=" + phone + "]";
}
}
  • Run.java 运行类
package com.gaoji.reflex;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
//动态实例化:是一种不通过new的方式来实例化对象
public class reflexdDome_02 {

public static void main(String[] args) throws NoSuchMethodException, SecurityException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

Class<?> c1 = Class.forName("com.gaoji.reflex.User");
// getConstructors();是用来获取所以public类型的构造方法
/* * Constructor<?>[] cons=c1.getConstructors(); * for (int i = 0; i < cons.length; i++) { * System.out.println(cons[i].toGenericString()); * } */
// .getDeclaredConstructors();获取所有的构造方法
/* * Constructor<?>[] cons=c1.getDeclaredConstructors(); * for (int i = 0; i < cons.length;i++) { * System.out.println(cons[i].toGenericString()); * * } */
// 获取指定的公有的构造方法
Constructor<?> c = c1.getConstructor(int.class);
System.out.println(c);
// 获得指定的构造方法
Constructor<?> c3 = c1.getDeclaredConstructor(int.class, String.class);
System.out.println(c3);
// 动态实例化
User u = (User) c3.newInstance(1, "张三");
System.out.println(u.toString());
//
}
}
  • 运行结果
			public com.gaoji.reflex.User(int)
com.gaoji.reflex.User(int,java.lang.String)
User [id=1, name=张三, sex=
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/106727.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • mysql float double区别_mysql float和double类型的区别

    mysql float double区别_mysql float和double类型的区别2017-11-04回答1.float类型float列类型默认长度查不到结果,必须指定精度,比如numfloat,insertintotable(num)values(0.12);select*fromtablewherenum=0.12的话,emptyset。numfloat(9,7),insertintotable(num)values(0.12);…

    2022年10月27日
  • mysql添加索引语句_mysql 添加索引语句

    mysql添加索引语句_mysql 添加索引语句1.PRIMARYKEY(主键索引)mysql>ALTERTABLE`table_name`ADDPRIMARYKEY(`column`)2.UNIQUE(唯一索引)mysql>ALTERTABLE`table_name`ADDUNIQUE(`column`)3.INDEX(普通索引)mysql>ALTERTABLE`…

  • Visual Studio 2015 解决方案资源管理器

    Visual Studio 2015 解决方案资源管理器位置解决方案资源管理器窗口默认位于右上角。它与另一个窗口类视图位于相同的位置。打开类视图可以在菜单栏中选择视图|类视图即可打开该窗口。如下图:解决方案管理器窗口显示了组成ConsoleApplication1项目的文件,包括我们在其中添加代码的文件Program.cs和其它内容。注意:所有C#代码文件都使用.cs文件扩展名。现在不需要考虑除了Pr

  • cubieboard开发板简介

    cubieboard开发板简介Cubieboard,简称Cb,是由珠海的Cubietech团队推出,跟业内有名的pcduino一样,Cubieboard是i基于珠海全志科技的A10/A20等系列处理器的开发板。Cubieboard初次生产是在2012年的8月8日,目前有三代产品,第一代是采用A10的基础版,其中有分8月8日生产的版本和9月9日生产的版本,第二代更换了双核处理器A20,并且经过测试可以稳定地运行在1.2Ghz上,

  • Js生成二维码_js在线生成二维码

    Js生成二维码_js在线生成二维码1引入jsjquery.jqprint-0.3.jsjquery.qrcode.min.jsjquery-migrate-1.4.1.js2html元素:二维码生成在img的div中,新增img标签,并设置为display:none3生成二维码$(“#ewm”).qrcode(“http://127.0.0.1:8080/pages/check/infos.h…

    2022年10月17日
  • idea 20.3激活码(最新序列号破解)

    idea 20.3激活码(最新序列号破解),https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号