反射

类的加载

  1. 加载:类的加载器将class文件加载到内存中,加载到方法区(.class,常量、静态方法、常量池、共享区域)
  2. 连接:校验的功能,校验数据的完整性和正确性。
  3. 初始化:给静态方法和静态变赋值。
  4. 加载完成后:虚拟机会自动创建这个class文件的对应的对象(Class对象用来描述class文件)。

类的初始化时机

什么时间会创建Class对象?

在方法去中创建 类.class文件。

  1. 创建类的实例
  2. 类的静态变量(存在共享区域),或者为静态变量赋值
  3. 类的静态方法
  4. 使用反射方式来强制创建某个类或者接口对应的java.lang.Class对象
  5. 初始化某个类的子类(创建父类的.class文件 和自己的.class文件)
  6. 直接使用java.exe命令来运行某个主类

反射

什么是反射

在类的Class运行期间,可以动态(在运行期间)的访问类中的变量和方法,或者修改变量的方法,这种机制叫反射。

在知道类的.class文件的情况下,通过Class对象操作类中的变量和方法,这种机制叫反射

为什么要用反射

有些时候我们知道一个类的完整路径,需要获得这个类里的属性、方法等,可以通过反射来获得。

  • 静态编译:在编译时确定类型,绑定对象
  • 动态编译:运行时确定类型,绑定对象。动态编译发挥了java的灵活性,体现了多态,降低类之间的耦合。

反射的作用

  • Class类
  • Constructor 构造
  • Method 方法
  • Field 字段 变量
  • instance 实例
  • invoke 执行 方法

获得Class对象的方式

  1. 类名.class;实例:Class c =Student.class
  2. 类名 对象=new 类名();对象.getClass();
  3. Class.forName(“类的完整路径”)
获得构造方法 Constructor

特别注意的是获取构造方法

  • Constructor getDeclaredConstructor(Class
获得class文件的方法 Method
  1. 获得Class对象
  2. 获得普通方法 Class对象的 XXXMethod()方法

  • Method getDeclaredMethod(String name, Class

获得Class文件里的变量 Feild 字段

  • Field getField(String name)
  • Field[] getFields()
  • Field getDeclaredField(String name)
    -Field[] getDeclaredFields()

获取实例

  • T newInstance()

  • 在使用获得私有的构造方法、私有的普通发送、私有的成员变量后 要设置可访问性

    void setAccessible(boolean flag)

这个方法是 java.lang.reflect
类 AccessibleObject;
AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。


  • 在调用静态的方法(被static修饰的方法 )时,传入的参数是null; invoke(null)

反射类的方法调用

Student对象
public class Student {

    private String name;
    private int age;


    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getname() {
        return name;
    }
    public void setname(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    private String eat(){
        return name+"吃";
    }
    public static void sleep(String name){
        System.out.println(name+"睡睡睡");
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }

}
测试类
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Demo {

    public static void main(String[] args)throws Exception {
        //利用反射获取 Student.class类
        Class<?> c=Class.forName("com.text.demo01.Student");

        //创建对象
        Object obj = c.newInstance();
        Student stu=(Student)obj;
        System.out.println(stu);
        //获取类的构造方法
        Constructor<?>[] cons = c.getConstructors();
        for (Constructor<?> con : cons) {
            System.out.println(con.getName()+"  "+con.getParameterCount());
        }
        //获得单个无参构造方法
        Constructor<?> con = c.getConstructor();
        System.out.println(con);
        //获取类的实例
        Object stu1 = con.newInstance();
        System.out.println(stu1);
        //获得单个有参构造方法
        Constructor<?> con1 = c.getConstructor(String.class,int.class);
        System.out.println(con1);
        Student stu2 = (Student)con1.newInstance("小明",23);
        System.out.println(stu2);
        System.out.println("=======================");
        //获得普通方法
        Method[] methods = c.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        Method setAge = c.getMethod("setAge", int.class);
        setAge.invoke(stu2, 33);
        System.out.println(stu2);
        //获得被private 修饰的方法
        Method eat = c.getDeclaredMethod("eat");
        //设置权限
        eat.setAccessible(true);
        Object stringName = eat.invoke(stu2);
        System.out.println(stringName);

        //获得静态的方法
        Method sleep = c.getMethod("sleep", String.class);
        sleep.invoke(null, "穆宁");

        System.out.println("========获取字段 即为对象的属性名称============");
        //获取的是没有被private修饰的属性
        Field[] fields = c.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        Field[] Fields = c.getDeclaredFields();
        for (Field field : Fields) {
            System.out.println(field);
        }

        //给私有的属性设一个值,读取出来
        Field fieldName = c.getDeclaredField("name");
        fieldName.setAccessible(true);
        fieldName.set(stu2, "小明大宝贝");
        System.out.println(stu2.getname());


    }
}

利用反射初始化用户

  • data.properties文件内容

id=001

username=jack

password=123

User类

public class User {

    private String id;
    private String username;
    private String password;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
    }

}

ReflectDemo类 反射

import java.io.FileInputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;
import java.util.Set;

public class RuflectDemo {

    public static void main(String[] args) throws Exception {
        //通过反射得到User对象
        Class<?> c = Class.forName("com.text.demo.User");
        User user = (User)c.newInstance();

        //读取配置文件
        Properties pro=getProperties();

        //设置User属性
//      user.setId(pro.getProperty("uid"));
//      user.setUsername(pro.getProperty("username"));
//      user.setPassword(pro.getProperty("password"));
        setFieldValue(c,user,pro);
        System.out.println(user);
    }

    private static void setFieldValue(Class<?> c, User user, Properties pro)throws Exception {
        //得到配置文件的信息
        Set<Object> keySet = pro.keySet();
        for (Object key : keySet) {
            String keyStr=(String) key;
            String value = pro.getProperty(keyStr);
            //根据key 拼接set方法
            String firstStr=keyStr.substring(0, 1).toUpperCase();//得到key的第一个字符,转成大写
            String otherStr=keyStr.substring(1);
            String methodName="set"+firstStr+otherStr;
            Field field = c.getDeclaredField(keyStr);
            field.setAccessible(true);
            Class<?> type = field.getType();
            if(type.getName().equals("int")){

                Method declaredMethod = c.getDeclaredMethod(methodName, int.class);
                declaredMethod.invoke(user, Integer.parseInt(value));
            }
            if(type.getName().equals("java.lang.String")){
                Method declaredMethod = c.getDeclaredMethod(methodName, String.class);
                declaredMethod.invoke(user, value);
            }
        }
    }

    private static Properties getProperties()throws Exception{
        //读取配置文件
        Properties pro=new Properties();

        pro.load(new FileInputStream("data.properties"));
        return pro;
    }

}
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

古月_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值