网站框架都有什么用,jsp wordpress,怎样设计电子商务网站的建设,房地产app文章目录 1. 反射1-1. 获取Class对象的三种方式1-2. 获取类的构造器、实例化对象1-3. 获取类的成员变量1-4. 获取类的成员方法 2. 注解2-1. 元注解2-2. 解析注解 1. 反射
反射#xff1a;加载类#xff0c;并允许以编程的方式解剖类中的各种成员变量、方法、构造器。
1-1. … 文章目录 1. 反射1-1. 获取Class对象的三种方式1-2. 获取类的构造器、实例化对象1-3. 获取类的成员变量1-4. 获取类的成员方法 2. 注解2-1. 元注解2-2. 解析注解 1. 反射
反射加载类并允许以编程的方式解剖类中的各种成员变量、方法、构造器。
1-1. 获取Class对象的三种方式
Class c 类名.class调用Class提供方法forName(String package)需要提供Java类的文件路径Object提供的方法Class c 对象.getClass()
package Java_fs;class User{}public class JavaFs1 {public static void main(String[] args) throws ClassNotFoundException {Class c User.class;System.out.println(c.getName());System.out.println(c.getSimpleName());System.out.println(**************************);Class c1 Class.forName(Java_fs.User);System.out.println(c1 c);System.out.println(**************************);User user new User();Class c2 user.getClass();System.out.println(c2 c);}
}1-2. 获取类的构造器、实例化对象
推荐使用类对象.getDeclaredXXX这种方式来获取这样可以获取所有的构造器而不是仅仅得到被public修饰的构造器。
package Java_fs;import java.lang.reflect.Constructor;class User2{private String name;private Integer age;public User2() {}private User2(String name){this.name name;}public User2(String name, Integer age) {this.name name;this.age age;}Overridepublic String toString() {return User2{ name name \ , age age };}
}public class JavaFs2 {public static void main(String[] args) throws NoSuchMethodException {Class c1 User2.class;System.out.println(获取被public修饰的构造器);Constructor[] constructors c1.getConstructors();// 只能获取被public修饰的构造器for (Constructor constructor : constructors) {System.out.println(构造器名为constructor.getName());// 获取构造器的名称System.out.println(参数个数为constructor.getParameterCount());// 构造器的参数个数}System.out.println(获取所有的构造器);// 获取所有的构造器Constructor[] constructors2 c1.getDeclaredConstructors();// 只能获取被public修饰的构造器for (Constructor constructor : constructors2) {System.out.println(构造器名为constructor.getName());// 获取构造器的名称System.out.println(参数个数为constructor.getParameterCount());// 构造器的参数个数}System.out.println(获取指定的构造器。。。。有参数的);Constructor constructor c1.getDeclaredConstructor(String.class,Integer.class);System.out.println(构造器名为constructor.getName()参数个数为constructor.getParameterCount());}
} 如果想通过这个构造器对象进行实例化可以直接.newInstance(参数)即可但是需要某个构造器是私有的那还是会报错如下
package Java_fs;import java.lang.reflect.Constructor;class User2{private String name;private Integer age;public User2() {}private User2(String name){this.name name;}public User2(String name, Integer age) {this.name name;this.age age;}Overridepublic String toString() {return User2{ name name \ , age age };}
}public class JavaFs2 {public static void main(String[] args) throws Exception{Class c1 User2.class;System.out.println(获取指定的构造器。。。。有参数的);Constructor constructor c1.getDeclaredConstructor(String.class,Integer.class);System.out.println(构造器名为constructor.getName()参数个数为constructor.getParameterCount());User2 user (User2) constructor.newInstance(张三, 20);System.out.println(user);Constructor constructor1 c1.getDeclaredConstructor(String.class);// constructor1.setAccessible(true);// 禁止检查访问权限User2 user2 (User2) constructor1.newInstance(张三);System.out.println(user2);}
} 这是因为这个一个参数的构造器是被private修饰的此时如果想强行获取到可以在构造器下方设置权限如下
1-3. 获取类的成员变量
推荐使用getDeclaredField这种方式来获取这样所有的都可以获取到。
package Java_fs;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;class User2{private static int a;private static final String COUNTRY China;private String name;public Integer age;Overridepublic String toString() {return User2{ name name \ , age age };}
}public class JavaFs2 {public static void main(String[] args) throws Exception{Class c1 User2.class;Field[] fields c1.getDeclaredFields();for (Field field : fields) {System.out.println(field);}}
}如果想获取指定的成员变量只需要输入成员变量名即可。如果成员变量被private进行修饰你想获取成员变量的值或者设置成员变量的值那么需要设置禁止检查访问权限才行否则会报错。
package Java_fs;import java.lang.reflect.Field;class User2{private static int a;private static final String COUNTRY China;private String name;public Integer age;Overridepublic String toString() {return User2{ name name \ , age age };}
}public class JavaFs2 {public static void main(String[] args) throws Exception{Class c1 User2.class;Field country c1.getDeclaredField(COUNTRY);country.setAccessible(true);// 设置禁止检查权限User2 user new User2();String country1 (String) country.get(user);System.out.println(country1);// 获取成员变量的值Field name c1.getDeclaredField(name);name.setAccessible(true);name.set(user,张三);System.out.println(user);}
} 1-4. 获取类的成员方法
推荐使用getDeclaredXXX这种方式来获取成员方法。 如果想执行方法对象对应的方法需要方法对象.invoke(某对象,参数)即可执行对应类下的方法。
package Java_fs;import java.lang.reflect.Field;
import java.lang.reflect.Method;class User2{private static int a;private static final String COUNTRY China;private String name;public Integer age;public void setName(String name){this.name name;}private void happy(String name){System.out.println(name哈哈);}private void eat(){System.out.println(吃饭。。);}Overridepublic String toString() {return User2{ name name \ , age age };}
}public class JavaFs2 {public static void main(String[] args) throws Exception{Class c1 User2.class;Method[] methods c1.getDeclaredMethods();// 获取所有的成员方法for (Method method : methods) {System.out.println(method.getName());}User2 user2 new User2();Method eat c1.getDeclaredMethod(eat);eat.setAccessible(true);// 设置禁止检查访问权限eat.invoke(user2);// 运行eat方法Method happy c1.getDeclaredMethod(happy,String.class);happy.setAccessible(true);// 设置禁止检查访问权限happy.invoke(user2,张三);// 运行happy方法}
} 2. 注解
就是Java代码里的特殊标记让其他程序根据注解信息来决定怎样执行该程序。注解本质是一个接口Java中所有的注解都是继承Annotation接口的xxx注解(…)其实就是一个实现类实现了该注解以及Annotation接口。
package zj;interface ZJOne {int a();String b();boolean c() default true;
}package zj;ZJOne(a12,b23,cfalse)
public class ZjStudy {ZJOne(a12,b23)public void test(){}public static void main(String[] args) {}
}2-1. 元注解
用于修饰注解的注解。有两个分别为Target、Retention。其中Target用于声明被修饰的注解只能在哪些位置上使用。 Retention用于声明注解的保留周期
2-2. 解析注解
package zj;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;Target({ElementType.TYPE,ElementType.METHOD})
// 应用在类和方法上面
Retention(RetentionPolicy.RUNTIME)
interface ZJOne {int a();String b();boolean c() default true;
}
package zj;import java.lang.annotation.Annotation;
import java.lang.reflect.Method;ZJOne(a12,b23,cfalse)
class Demo{ZJOne(a21,b嘻嘻哈哈)public void print(){}
}public class ZjStudy {public static void main(String[] args) throws Exception {Class c Demo.class;ZJOne zjOne (ZJOne) c.getDeclaredAnnotation(ZJOne.class);System.out.println(zjOne.a());System.out.println(zjOne.b());System.out.println(zjOne.c());// 获取在类上的注解数据Method print c.getDeclaredMethod(print);ZJOne zjOne1 print.getDeclaredAnnotation(ZJOne.class);System.out.println(zjOne1.a());System.out.println(zjOne1.b());System.out.println(zjOne1.c());// 获取方法上注解数据}
}