Java反射机制学习笔记(1)

Java反射机制学习笔记

1.什么是Java反射

反射是指可以分析一个类的功能的程序。

2.反射的原理

    java运行时系统在程序运行时,需要识别程序中的对象,于是会为每个对象提供一个表示信息,

来区别对象所属的类型,这个标识信息保存了类的相关信息。于是Java提供了一个类用来存储这些信息,他就是Class类。

获取对象的Class类有三种方法。

		①getClass()方法
		例子:
		String s="abc";
		Class c=s.getClass();//这里的c就包含了String类型的相关信息。
		通过c.getName()方法可以获取String类型的名字。
		②Class.forName()方法
		如:Class c=Class.forName("java.time.LocalDate");
		③class属性
		Class c=String.class;

3.前面说了反射的概念,下面来看实用。

**一.**记住几个重要的方法
首先先记住4个类,Class,Constructor(构造器类),Field(域类),Method(方法类),Modifier(修饰符类);
①**Class的方法,你需要记住下面8个,很重要。**
方法描述
Field[] getFields()获取所有公有域(包括继承得到的公有域),并返回Field数组,如果是基础数据类型或数组类型或没有域,返回大小为0的数组。
Filed[] getDeclaredFie1ds()获取类的所有域(包括继承得到的),并返回Field数组如果是基础数据类型或数组类型或没有域,返回大小为0的数组。
Method[] getMethods()获取所有公有方法(包括继承得到的),并返回Method数组
Method[] getDeclareMethods()获取类或接口的所有公有方法(不包括继承得到的),并返回Method数组
Constructor[] getConstructors()类的所有公有构造器
Constructor[] getDeclaredConstructors()类的所有构造器
int getModifiers( )返回的整型数值。
String getName( )返冋类名字符串。

Constructor,Field,Method的方法

方法描述
Class[] getExceptionTypes ( )在 Constructor 和 Method 类 中返回一个用于描述方法抛出的异常类型的 Class 对象数组。
int getModifiers( )返回一个用于描述构造器、 方法或域的修饰符的整型数值。
String getName( )返冋一个用于描述构造器、 方法或域名的字符串。
Class[] getParameterTypes ( )在 Constructor 和 Method类中返回一个用于描述参数类型的 Class 对象数组。
Class getReturnType( )在 Method 类 中返回一个用于描述返回类型的 Class 对象。

③Modifier的方法,很多,我下面讲代码是用到的方法有这个

方法描述
static String toString(int modifiers )返回对应 modifiers 中位设置的修饰符的字符串表示。

就是上面的Class与其他三个类的getModifiers方法返回的值放到这可以返回它们对应的名字。

**二.**代码实战
package ReflectTest;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;
public class ReflectTest {
    static Class cL;//本类
   static Class supercl;//父类

    public static void main(String[] args) {
        String ClassName = "";//接收类名
        try {
            if(args.length>0)
            {
                ClassName=args[0];
                cL = Class.forName(ClassName);
                supercl = cL.getSuperclass();
            }
            else
            {
                Scanner scan = new Scanner(System.in);
                ClassName =  scan.next();
                cL=Class.forName(ClassName);
                supercl = cL.getSuperclass();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        String modifier = Modifier.toString(cL.getModifiers());
        if(modifier.length()>0)
        System.out.print(modifier+" ");
        System.out.print("class"+" "+ClassName+" ");
        if(supercl.getName().length()>0&&supercl!=Object.class)
            System.out.print("extends"+" "+ supercl.getName());
        System.out.println("{"+"\n");
        printConstructors(cL);
        System.out.println();
        printMethods(cL);
        System.out.println();
        printFields(cL);
        System.out.println("}");
    }
    static void  printConstructors(Class c){
        Constructor[] cons = c.getDeclaredConstructors();
        for (Constructor con : cons ) {
            String modifierWords = Modifier.toString(con.getModifiers());
            if(modifierWords.length()>0)
            {
                System.out.print(modifierWords+" ");
            }
            System.out.print(con.getName()+"(");
            Class[] css = con.getParameterTypes();
            for(int i=0;i<css.length;i++)
            {
                if(i>0)
                System.out.print(","+css[i].getName());
                else
                System.out.print(css[i].getName());
            }
            System.out.println(")"+";");
        }

    }
    static  void  printMethods(Class c)
    {
        Method[] methods = c.getDeclaredMethods();
        for(Method method : methods)
        {
            Class[] types = method.getParameterTypes();
            System.out.print(Modifier.toString(method.getModifiers())+" "+method.getReturnType().getName()+" "+method.getName()+"(");
            for(int i=0;i<types.length;i++)
            {
                if(i>0)
                    System.out.print(","+types[i].getName());
                else
                    System.out.print(types[i].getName());
            }
            System.out.println(")"+";");
        }

    }
    static  void  printFields(Class c)
    {
      Field[] fields = c.getFields();
      for(Field field : fields)
      {
          System.out.print(field.getType().getName()+" "+field.getName()+";");
          System.out.println();
      }
    }
}

下面是结果在这里插入图片描述
在这里插入图片描述


深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值