JavaBean: 데이터베이스 테이블과 엔터티 클래스의 대응
1. 데이터베이스에 테이블이 있으면 그 테이블에 해당하는 클래스가 있을 것입니다
데이터베이스: Person 테이블 Java: Preson 클래스
2. 테이블의 각 열은 다음에 해당합니다. Java A 필드(멤버 변수)
3. 테이블의 각 행은 Java의 객체에 해당합니다.
Zhang San 18 men new Person(Zhang San 18 man);
Xiaohua 18 female new Person(Xiaohua 18 female);
더 많은 객체 컬렉션 ArrayList
JavaBean에는 다음이 포함됩니다.
1. 전용 멤버 변수
2. 공용 getter/setter 메소드
3. 빈 매개변수 구성 메소드
4. toString 메소드
5. 직렬화 인터페이스 구현
클래스 파일 객체를 얻는 세 가지 방법:
1. 객체 클래스
Class> getClass()의 getClass() 메서드를 사용하여 이 객체의 런타임 클래스를 반환합니다.
2. 클래스 이름.class 속성을 사용하세요
각 데이터 유형, 기본 데이터 유형 및 참조 데이터 유형에 대해 Java는 이에 대한 클래스 속성을 설정합니다.
클래스 clazz = int.class
클래스 clazz = String.class
클래스 clazz = Person .class
3. Class 클래스에서 정적 메소드 forName
을 사용합니다. static Class> forName(String className)
주어진 문자열 이름을 가진 클래스 또는 인터페이스와 연관된 Class 객체를 반환합니다.
참고: 각 클래스의 클래스 파일 개체는 한 번만 생성되며 고유합니다.
리플렉션 기술을 사용하여 클래스의 생성자를 가져와 인스턴스화합니다.
* public Person() {}
* public Person(문자열 이름, int age, String sex) {}
* private Person(String name, int age) {}
*
* 구현 단계:
* 1. Person 클래스의 클래스 파일 객체를 가져옵니다.
* 2. getConstructor 메소드를 사용합니다. 클래스 파일 객체 생성자 메서드 가져오기
* 3. 생성자의 newInstrance 메서드를 사용하여 생성자를 인스턴스화합니다.
리플렉션을 사용하여 빈 매개변수 객체를 생성하는 빠른 방법
* 사용을 위한 전제 조건:
* 1. 다음이 있어야 합니다. 클래스에 빈 매개변수가 있는 생성자 메서드
* 2. 빈 매개변수가 있는 생성자 메서드의 수정자는 비공개일 수 없습니다. public
*
* 클래스 클래스에 메서드가 있습니다
* T newInstance() 이 Class 객체가 나타내는 클래스의 새 인스턴스를 만듭니다.
*
리플렉션 기술을 사용하여 클래스의 멤버 변수(필드)를 얻고, 멤버 변수에 값을 할당하고, 값을 얻습니다.
* private String name;
* private int age
* public String;
*
* 구현 단계:
* 1. Person 클래스의 클래스 파일 개체를 가져옵니다.
* 2. 클래스 파일 개체의 getField 메서드를 사용하여 멤버 변수를 가져옵니다.
* 3. get/set 메서드를 사용합니다. 필드에서 멤버 변수 값을 가져오고 멤버 변수에 값을 할당합니다.
1 public static void main(String[] args) throws Exception { 2 //1.获取Person类的class文件对象 3 Class clazz = Class.forName("cn.itcast.demo02.javabean.Person"); 4 //2.使用class文件对象中的方法getField获取成员变量 5 /* 6 * Field[] getFields() 获取类中所有可访问公共字段。 7 * Field[] getDeclaredFields() 获取类中所有的声明字段,包含私有的。 8 */ 9 Field[] fields1 = clazz.getFields();10 for (Field field : fields1) {11 System.out.println(field);12 }13 System.out.println("------------------");14 Field[] fields2 = clazz.getDeclaredFields();15 for (Field field : fields2) {16 System.out.println(field);17 }18 System.out.println("------------------");19 20 /*21 * Field getField(String name) 获取类中指定公共成员字段。22 * Field getDeclaredField(String name) 获取类中指定的声明字段,包含私有的。23 * 参数:24 * String name:字段的名字25 */26 //public String sex;27 Field sexField = clazz.getField("sex");28 System.out.println(sexField);29 //private String name;30 Field nameField = clazz.getDeclaredField("name");31 System.out.println(nameField);32 //private int age;33 Field ageField = clazz.getDeclaredField("age");34 System.out.println(ageField);35 36 /*37 * 3.使用Field中的方法get/set获取成员变量值,给成员变量赋值38 * Object get(Object obj) 返回指定对象上此 Field 表示的字段的值。 39 * void set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。40 * 参数:41 * Object obj:要设置值/获取的值的对象,可以使用反射快速创建42 * Object value:给成员变量设置的实际值43 * 返回值:44 * Object:获取成员变量的返回值 45 */46 //使用反射创建对象47 Object obj = clazz.newInstance();48 49 //public String sex;50 //get(obj);-->getSex();51 Object sexValue = sexField.get(obj);52 System.out.println(sexValue);//默认值 null53 54 /*55 * private String name;56 * 私有的属性无法直接使用,必须先取消Java的权限检查(暴力反射)57 */58 nameField.setAccessible(true);59 Object nameValue = nameField.get(obj);60 System.out.println(nameValue);//默认值 null61 62 //private int age;63 ageField.setAccessible(true);64 Object ageValue = ageField.get(obj);65 System.out.println(ageValue);//默认值 066 System.out.println("------------------");67 /*68 * 设置成员变量的值69 */70 //public String sex;71 sexField.set(obj, "妖");72 //获取值73 sexValue = sexField.get(obj);74 System.out.println(sexValue);//妖75 76 //private String name;77 nameField.set(obj, "泰国美女");78 //获取值79 nameValue = nameField.get(obj);80 System.out.println(nameValue);//泰国美女81 82 //private int age;83 ageField.set(obj, 18);84 //获取值85 ageValue = ageField.get(obj);86 System.out.println(ageValue);//1887 System.out.println(obj);//Person [name=泰国美女, age=18, sex=妖]88 }
리플렉션 기술을 사용하여 클래스의 멤버 메서드를 가져와 실행합니다.
* public String getName()
* public void setName(String name)
* private void method()
*
* 구현 단계:
* 1. Person 클래스 가져오기 클래스 파일 객체
* 2. 클래스 파일 객체의 getMethod 메소드를 사용하여 멤버 메소드 가져오기
* 3. 획득한 메소드를 실행하기 위해 Method 내 메소드 호출
*
* Method 클래스의 메소드: getName, 메소드 이름 가져오기
* String getName()은 이 Method 객체가 나타내는 메소드 이름을 String 형식으로 반환합니다.
1 public static void main(String[] args) throws Exception { 2 //1.获取Person类的class文件对象 3 Class clazz = Class.forName("cn.itcast.demo02.javabean.Person"); 4 //2.使用class文件对象中的方法getMethod获取成员方法 5 /* 6 * Method[] getMethods() 获取类中所有的公共方法,包含继承父类的 7 * Method[] getDeclaredMethods() 包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 8 */ 9 Method[] methods1 = clazz.getMethods();10 for (Method method : methods1) {11 System.out.println(method);12 }13 System.out.println("----------------------");14 Method[] methods2 = clazz.getDeclaredMethods();15 for (Method method : methods2) {16 System.out.println(method.getName());17 }18 System.out.println("----------------------");19 /*20 * Method getMethod(String name, Class<?>... parameterTypes) 获取类中指定公共成员方法。21 * Method getDeclaredMethod(String name, Class<?>... parameterTypes) 获取类中指定的成员方法,包含私有的.22 * 参数:23 * String name:方法的字符串名称24 * Class<?>... parameterTypes:方法参数列表的class对象 25 */26 //public String getName()27 Method getNameMethod = clazz.getMethod("getName");28 System.out.println(getNameMethod);29 30 //public void setName(String name)31 Method setNameMethod = clazz.getMethod("setName", String.class);32 System.out.println(setNameMethod);33 34 //private void method()35 Method privateMethod = clazz.getDeclaredMethod("method");36 System.out.println(privateMethod);37 38 /*39 * 3.使用Method中的方法invoke执行获取到的方法40 * Object invoke(Object obj, Object... args) 41 * 参数:42 * Object obj:要执行的方法的所属对象43 * Object... args:执行方法,传递的实际参数44 * 返回值:45 * Object:方法的返回值46 * 如果方法没有返回值,Object的值为null47 */48 Object obj = clazz.newInstance();49 50 //public String getName()51 Object v1 = getNameMethod.invoke(obj);52 System.out.println(v1);//成员变量 name的默认值:null53 54 //public void setName(String name)55 Object v2 = setNameMethod.invoke(obj, "楼上老宋");56 System.out.println(v2);57 58 v1 = getNameMethod.invoke(obj);59 System.out.println(v1);//成员变量 name的值:楼上老宋60 61 /*62 * private void method()63 * 使用暴力反射,取消Java的权限检查64 */65 privateMethod.setAccessible(true);66 privateMethod.invoke(obj);//私有方法67 68 System.out.println("-------------");69 //获取返回值为数组的方法70 Method arrMethod = clazz.getMethod("methodArr");71 Object v3 = arrMethod.invoke(obj);72 int[] arr = (int[]) v3;73 System.out.println(v3);74 System.out.println(arr);75 for (int i : arr) {76 System.out.println(i);77 }78 }
Reflection의 종합 사례:
* Reflection 기술을 통해 JavaBean 객체를 얻고, JavaBean 멤버 변수에 값을 주입(할당)합니다
*
* 구현 단계:
* 1. JavaBean(사용자 클래스) 생성
* 2. data.properties 구성 파일을 생성하고 멤버 변수의 실제 값을 구성합니다
* 3. IO+Properties 컬렉션을 사용하여 구성 파일을 읽고 파일의 데이터를 컬렉션에 저장합니다
* 4. 사용 JavaBean 객체 생성을 위한 리플렉션 기술
* 5. Properties 컬렉션 탐색
* 6. Properties 컬렉션 키를 사용하여 setXXX 메서드 연결
* 7. 리플렉션 기술을 사용하여 setXXX 메서드 획득
* 8. 리플렉션 기술을 사용하여 실행 setXXX 메서드를 사용하여 멤버 변수에 값을 삽입합니다
1 public static void main(String[] args) throws Exception { 2 //3.使用IO+Properties集合,读取配置文件,把文件中的数据保存到集合中 3 Properties prop = new Properties(); 4 prop.load(new FileReader("data.properties")); 5 //4.使用反射技术创建JavaBean对象 6 Class clazz = Class.forName("cn.itcast.demo02.javabean.User"); 7 Object obj = clazz.newInstance(); 8 //5.遍历Properties集合 9 Set<String> set = prop.stringPropertyNames();10 for (String key : set) {11 /*12 * 6.使用Properties集合key拼接setXXX方法13 * 类中的set方法:14 * setId,setUsername,setPassword15 * 集合的key:16 * id,username,password17 * 拼接的过程:18 * 1.固定的字符串:"set"19 * 2.获取key的首字母,变成大写20 * 3.获取key的其它字母21 */22 String methodName = "set"+key.substring(0, 1).toUpperCase()+key.substring(1);23 //System.out.println(methodName);24 25 //7.使用反射技术获取setXXX方法26 Method setMethod = clazz.getMethod(methodName, String.class);27 //8.使用反射技术执行setXXX方法,给成员变量注入值(集合的value值)28 setMethod.invoke(obj, prop.get(key));29 30 /*31 * 扩展:拼接getXXX方法32 */33 String getMethodName = "get"+key.substring(0, 1).toUpperCase()+key.substring(1);34 Method getMethod = clazz.getMethod(getMethodName);35 Object value = getMethod.invoke(obj);36 System.out.println(value);37 }38 System.out.println(obj);39 }
리플렉션 기술을 사용하여 인터페이스를 가져옵니다
* Class>[] getInterfaces()는 클래스가 구현하는 인터페이스 또는 이 객체가 나타내는 인터페이스를 결정합니다
위 내용은 Java 튜토리얼--기본 강화_반사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!