反射和动态实例化

反射和动态实例化

反射

  • 个人理解:在我们面向对象编程时,有时候需要我们对类这个对象进行操作,需要识别对象和类的信息,所以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=
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106729.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • RabbitMQ启动出现的问题与解决办法「建议收藏」

    RabbitMQ启动出现的问题与解决办法「建议收藏」RabbitMQ启动出现的问题与解决办法如果下面的文章解决不了您的问题,可以关注公众号:程序员开发者社区,点击与我联系,加我微信。尽量为您解答。回复:谷歌插件。可以使用chrome访问google了。百度搜索如何离线安装Chrome插件https://mp.weixin.qq.com/s/P7sQjtmYtTOm-Q1QkZ…

    2022年10月23日
    0
  • KNN 回归算法_DTW算法

    KNN 回归算法_DTW算法KNN算法也能够用于回归预测。KNN算法用于分类的方法如下:首先,对于一个新来的预测实例,我们在训练集上寻找它的最相近的K个近邻;然后,采用投票法将它分到这K个邻居中的最多的那个类。但是,怎么将KNN算法用于回归呢?其实大致的步骤是一样的,也是对新来的预测实例寻找K近邻,然后对这K个样本的目标值取均值即可作为新样本的预测值。…

    2022年8月21日
    11
  • 25行代码实现完整的RSA算法

    25行代码实现完整的RSA算法25行代码实现完整的RSA算法  网络上很多关于RSA算法的原理介绍,但是翻来翻去就是没有一个靠谱的算法实现,即使有代码介绍,也都是直接调用JDK或者Python代码包中的API实现,或者即使有代码也都写得特别烂。无形中让人感觉RSA加密算法竟然这么高深,然后就看不下去了。还有我发现对于“大整数的幂次乘方取模”竟然采用直接计算的幂次的值,再取模,类似于(2^1024)^(2^102…

    2022年6月6日
    31
  • Gamma校正原理及python实现

    Gamma校正原理及python实现Gamma校正原理:  假设图像中有一个像素,值是200,那么对这个像素进行校正必须执行如下步骤:  1.归一化:将像素值转换为0~1之间的实数。算法如下:(i+0.5)/256这里包含1个除法和1个加法操作。对于像素A而言,其对应的归一化值为0.783203。  2.预补偿:根据公式,求出像素归一化后的数…

    2022年9月22日
    0
  • ldap服务器签名要求修改,域控制器 LDAP 服务器签名要求

    ldap服务器签名要求修改,域控制器 LDAP 服务器签名要求你好,我们可以通过以下方法查看签名要求是否打开着:在DC中打开默认域策略(defaultdomainpolicy),展开目录:计算机配置>策略>windows设置>安全设置>本地策略>安全选项,在右侧的策略中有一条策略为“Domaincontroller:LDAPserversigningrequirements”由于我的环境中只有英文的系统,所以…

    2022年5月14日
    37
  • 5G NR SSB概述[通俗易懂]

    5G NR SSB概述[通俗易懂]       SSB(SynchronizationSignal/PBCH,同步广播块)是5G中使用的最重要的导频信道之一,其作用关系到UE接入小区的很多方面,如小区搜索、波束测量、波束选择、波束恢复等。1、SSB时频域结构       在5G中,SSB包括同步信号和广播信号,具体同步信号包括PSS(PrimarySynchronizationSignal,

    2022年6月29日
    159

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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