【Java开发】java相关的小知识点

值传递和引用传递

Java 有 8 种基本数据类型,分别是 int、long、byte、short、float、double 、char 和 boolean

  • Java 中的参数传递是按值传递的。
  • 如果参数是基本类型,传递的是基本类型的字面量值的拷贝。
  • 如果参数是引用类型,传递的是引用的对象在堆中地址的拷贝。
1
2
3
4
5
6
7
8
9
10
11
class ReferenceTypeDemo {
public static void main(String[] args) {
String name = "二哥";
modify(name);
System.out.println(name);
}

private static void modify(String name1) {
name1 = "三妹";
}
}

在 Java 中,String 是不可变的(immutable)。当你把 name 变量传递给 modify 方法时,实际上是将 name 的值(即字符串 "二哥")的引用复制给了 modify 方法中的参数 name1。因此,name1name 都指向 "二哥" 这个字符串。
modify 方法中,name1 = "三妹"; 只是将 name1 变量指向了一个新的字符串 "三妹",并没有改变原来的 name 变量的内容。name 仍然指向 "二哥",因此在 main 方法中输出 name 时,仍然会输出 "二哥"

Java反射

  • 开发通用框架:像 Spring,为了保持通用性,通过配置文件来加载不同的对象,调用不同的方法。
  • 动态代理:在面向切面编程中,需要拦截特定的方法,就会选择动态代理的方式,而动态代理的底层技术就是反射。
  • 注解:注解本身只是起到一个标记符的作用,它需要利用发射机制,根据标记符去执行特定的行为。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public class ReflectionDemo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
    Writer writer = new Writer();
    writer.setName("沉默王二");
    System.out.println(writer.getName());

    Class clazz = Class.forName("com.itwanger.s39.Writer");
    Constructor constructor = clazz.getConstructor();
    Object object = constructor.newInstance();

    Method setNameMethod = clazz.getMethod("setName", String.class);
    setNameMethod.invoke(object, "沉默王二");
    Method getNameMethod = clazz.getMethod("getName");
    System.out.println(getNameMethod.invoke(object));
    }
    }