浏览代码

0410 reflect

Qing 1 年之前
父节点
当前提交
af2bcc3aac

+ 80 - 0
spring-demo/src/main/java/com/sf/reflect/TestReflect.java

@@ -0,0 +1,80 @@
+package com.sf.reflect;
+
+import com.sf.javase.TestString;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+
+public class TestReflect {
+
+    public static void main(String[] args) throws Exception {
+        Class testReflect = TestReflect.class;
+        Class forName = Class.forName("com.sf.reflect.TestReflect");
+        // 获取类对象的方式有多种  但同一个类的对象只有一个
+        // true or false
+        System.out.println(testReflect == forName);
+
+        // 按住ctrl点进去
+        String str = new String("hello");
+        String str1 = new String("world");
+        // 我们声明的类或jdk提供的类 本身也是一个对象  是Class类的对象
+        // 如果我们有String类型的对象 还有Integer类型的对象
+        // 通过对象 获取类对象
+        Class strClass = str.getClass();
+        Class str1Class = str1.getClass();
+        System.out.println(strClass == str1Class);
+        Integer i1 = 1;
+        Class intClass = i1.getClass();
+
+        Object o = strClass.newInstance();
+        Object o1 = testReflect.newInstance();
+        // 和直接创建对象的区别
+        TestReflect testReflect1 = new TestReflect();
+
+        // 获取String类的属性
+        // .var快捷键
+        // .sout快捷键
+        Field[] fields = strClass.getDeclaredFields();
+        // for循环快捷键 iter itar
+        for (Field field : fields) {
+            // 依次获取属性的修饰符、类型名称、属性名称
+            // 修饰符本身是数字  所以再把数字转化成字符串
+            System.out.print(field.getModifiers() + " ");
+            System.out.print(Modifier.toString(field.getModifiers()) + " ");
+            System.out.print(field.getType() + " ");
+            System.out.print(field.getType().getSimpleName() + " ");
+            System.out.print(field.getName());
+            System.out.println();
+        }
+
+        System.out.println("------");
+        // 获取String类的方法 by FanYunLong
+        Method[] declaredMethods = strClass.getDeclaredMethods();
+        for (Method declaredMethod : declaredMethods) {
+            System.out.print(Modifier.toString(declaredMethod.getModifiers())+" ");
+            System.out.print(declaredMethod.getReturnType().getSimpleName()+" ");
+            System.out.print(declaredMethod.getName());
+            System.out.println();
+        }
+
+        System.out.println("------");
+        //strClass.getDeclaredFields();
+        // 如果要获取全部的 使用getDeclaredFields()
+        // 如果要获取公有的属性  使用getFields()
+        Field[] strClassFields = strClass.getFields();
+        for (Field strClassField : strClassFields) {
+            System.out.print(Modifier.toString(strClassField.getModifiers()) + " ");
+            System.out.print(strClassField.getType().getSimpleName() + " ");
+            System.out.print(strClassField.getName());
+            System.out.println();
+        }
+
+        //获取构造方法
+        Constructor<?>[] constructors = strClass.getConstructors();
+        for (Constructor<?> constructor : constructors) {
+            System.out.println(constructor);
+        }
+    }
+}

+ 49 - 0
spring-demo/src/main/java/com/sf/reflect/TestUser.java

@@ -0,0 +1,49 @@
+package com.sf.reflect;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+public class TestUser {
+
+    public static void main(String[] args) throws Exception {
+        //        User user = new User("zhangsan");
+        User zhangsan = handle("com.sf.reflect.User", "zhangsan");
+//        User lisi = handle("com.sf.reflect.User", "lisi");
+    }
+
+    public static User handle(String className, String nameValue) throws Exception {
+        // 通过类的路径 获取类对象(类的代码)
+        Class userClass = Class.forName(className);
+        // 通过反射创建对象
+        // 先获取构造器 再创建对象
+        User user = (User) userClass.getDeclaredConstructor().newInstance();
+        // 获取全部属性
+        Field[] fields = userClass.getDeclaredFields();
+        // 可以根据属性名获取具体的某个属性
+        // private String name; 拿到这一段代码
+        Field name = userClass.getDeclaredField("name");
+//        userClass.newInstance();
+        // 找到了属性 对某个对象的此属性赋值
+        // user.name = "zhangsan";
+//        user.name = "zhangsan"; // 'name' has private access in 'com.sf.reflect.User'
+        // 如果这个属性是私有的 直接设置属性的值会报错
+        // Exception in thread "main" java.lang.IllegalAccessException: class com.sf.reflect.TestUser cannot access a member of class com.sf.reflect.User with modifiers "private"
+        //	at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:392)
+
+        // 设置这个属性是可以被访问的  打破了封装
+        name.setAccessible(true);
+        // 第一个参数是对象本身  第二个参数是 要赋的值本身
+        name.set(user, nameValue);
+        // 可以获取这个属性是否赋值成功
+        System.out.println(name.get(user));
+
+
+        // 获取方法 调用方法
+        Method setName = userClass.getDeclaredMethod("setName", String.class);
+        // 触发方法调用
+        setName.invoke(user,"zhangsan-new");
+        // sout(user.name)
+        System.out.println(name.get(user));
+        return user;
+    }
+}

+ 44 - 0
spring-demo/src/main/java/com/sf/reflect/TestUserByHCB.java

@@ -0,0 +1,44 @@
+package com.sf.reflect;
+
+import java.lang.reflect.Field;
+
+// by HuangChuiBang
+public class TestUserByHCB {
+    public static void main(String[] args) throws Exception {
+        //        User user = new User("zhangsan");
+        User zhangsan = handle("com.sf.reflect.User", "zhangsan", 18);
+        User lisi = handle("com.sf.reflect.User", "lisi", 19);
+    }
+
+    public static User handle(String className, String nameValue, int ageValue) throws Exception {
+        // 通过类的路径 获取类对象(类的代码)
+        Class userClass = Class.forName(className);
+        // 通过反射创建对象
+        // 先获取默认的无参的构造器 再创建对象
+        User user = (User) userClass.getDeclaredConstructor().newInstance();
+        // 获取全部属性
+        Field[] fields = userClass.getDeclaredFields();
+        // 可以根据属性名获取具体的某个属性
+        // private String name; 拿到这一段代码
+        Field name = userClass.getDeclaredField("name");
+        Field age = userClass.getDeclaredField("age");
+//        userClass.newInstance();
+        // 找到了属性 对某个对象的此属性赋值
+        // user.name = "zhangsan";
+//        user.name = "zhangsan"; // 'name' has private access in 'com.sf.reflect.User'
+        // 如果这个属性是私有的 直接设置属性的值会报错
+        // Exception in thread "main" java.lang.IllegalAccessException: class com.sf.reflect.TestUser cannot access a member of class com.sf.reflect.User with modifiers "private"
+        //	at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:392)
+
+        // 设置这个属性是可以被访问的  打破了封装
+        name.setAccessible(true);
+        age.setAccessible(true);
+        // 第一个参数是对象本身  第二个参数是 要赋的值本身
+        name.set(user, nameValue);
+        age.set(user, ageValue);
+        // 可以获取这个属性是否赋值成功
+        System.out.print(name.get(user) + " ");
+        System.out.println(age.get(user) + "岁");
+        return user;
+    }
+}

+ 43 - 0
spring-demo/src/main/java/com/sf/reflect/User.java

@@ -0,0 +1,43 @@
+package com.sf.reflect;
+
+public class User {
+    private String name;
+    // 省略get set
+
+    private int age;
+    // 添加一个属性 int age
+
+    public User() {
+    }
+
+    public User(String name) {
+        this.name = name;
+    }
+
+    public User(String name, int age) {
+        this.name = name;
+        this.age = age;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+}
+
+// class User  类的声明 对应Class类的对象
+// private String name;  Field类的对象 包含修饰符、属性类型、属性名称
+
+//     public String getName() {
+//        return name;
+//    }
+
+//     public void setName(String name) {
+//        this.name = name;
+//    }
+//  Method类型的对象   包含修饰符、返回值类型、方法名称
+// Method[]