자바 반사 메커니즘 의 학습 총화

1.반사 메커니즘 이 무엇 인지 간단하게 말하자면 반사 메커니즘 은 프로그램 이 실 행 될 때 자신의 정 보 를 얻 을 수 있 는 것 을 말한다.자바 에 서 는 주어진 클래스 의 이름 만 있 으 면 반사 체 제 를 통 해 클래스 의 모든 정 보 를 얻 을 수 있 습 니 다.
2.반사 체 제 를 어디서 사용 하 는 지 가끔 은 지식 을 사 용 했 지만 전문 용어 가 무엇 인지 몰 랐 습 니 다.jdbc 를 배 울 때 한 줄 의 코드 를 사 용 했 습 니 다.Class.forName("com.my sql.jdbc.Driver.class").new Instance().그러나 그 때 는 그 코드 가 구동 대상 을 만 드 는 인 스 턴 스 라 는 것 만 알 고 구체 적 인 의 미 를 몰 랐 다.반사 메커니즘 이라는 수업 을 들 은 후에 야 알 게 되 었 다.원래 이것 이 반사 라 는 것 을 알 게 되 었 다.현재 많은 프레임 워 크 는 반사 체 제 를 사용 하고 hibenate,struts 는 모두 반사 체제 로 이 루어 진 것 이다.
3.반사 메커니즘 의 장점 과 단점 은 왜 반사 메커니즘 을 사용 해 야 합 니까?대상 을 직접 만 들 면 되 지 않 습 니까?이것 은 동태 와 정태 적 인 개념 과 관련 됩 니 다.정적 컴 파일:컴 파일 할 때 유형,바 인 딩 대상,즉 통과 합 니 다.동적 컴 파일:실행 시 유형,바 인 딩 대상 을 확인 합 니 다.동적 컴 파일 은 자바 의 유연성 을 최대한 발휘 하여 다 중 응용 을 나타 내 고 류 간 의 연근 합 성 을 낮 춘 다.한 마디 로 하면 반사 메커니즘 의 장점 은 동적 창설 대상 과 번역 을 실현 할 수 있 고 매우 큰 유연성 을 나 타 낼 수 있다 는 것 이다.특히 J2EE 의 개발 에서 그의 유연성 은 매우 뚜렷 하 다.예 를 들 어 대형 소프트웨어 는 한 번 에 그것 을 완벽 하 게 설계 할 수 없다.이 프로그램 을 컴 파일 한 후에 발표 했다.어떤 기능 을 업데이트 해 야 한 다 는 것 을 발 견 했 을 때 우 리 는 사용자 에 게 이전의 마 운 트 를 해제 하고 새로운 버 전 을 다시 설치 하 라 고 할 수 없다.만약 그렇다면 이 소프트웨어 는 틀림없이 많은 사람 이 사용 하지 않 을 것 이다.정적 을 사용 하면 전체 프로그램 을 다시 컴 파일 해 야 기능 의 업 데 이 트 를 실현 할 수 있 습 니 다.반사 체 제 를 사용 하면 마 운 트 를 해제 하지 않 고 실행 할 때 만 동적 으로 만 들 고 컴 파일 하면 이 기능 을 실현 할 수 있 습 니 다.
그것 의 단점 은 성능 에 영향 을 미 치 는 것 이다.반 사 를 사용 하 는 것 은 기본적으로 해석 작업 이다.우 리 는 JVM 에 게 우리 가 무엇 을 하고 싶 은 지 알려 주 고 우리 의 요 구 를 만족 시 킬 수 있다.이런 조작 은 항상 같은 조작 만 직접 실행 하 는 것 보다 느리다.
4.반사 체 제 를 이용 하여 어떤 정 보 를 얻 을 수 있 는 지,유형 에 어떤 정보 가 있 으 면 어떤 정 보 를 얻 을 수 있 습 니 다.그러나 전 제 는 유형의 이름 을 알 아야 합 니 다.그렇지 않 으 면 뒷글 이 없습니다.먼저 들 어 오 는 유형의 전체 이름 에 따라 Class 대상 을 만들어 야 합 니 다.Class c=Class.forName("className");설명:className 은 전체 이름 이 어야 합 니 다.즉,가방 이름 을 포함해 야 합 니 다.예 를 들 어 cn.netjava.pojo.UserInfo;Object obj=c.newInstance();//대상 을 만 드 는 인 스 턴 스 OK.대상 이 있 으 면 모든 것 이 잘 되 고 원 하 는 정보 가 있 으 면 모든 정보 가 있 습 니 다.   구조 함 수 를 얻 는 방법 Constructor getConstructor(Class[]params)//지정 한 매개 변수 에 따라 Public 구조 기 를 얻 습 니 다.
Constructor[]getConstructors()/public 의 모든 구조 기 획득
Constructor getDeclared Constructor(Class[]params)//지정 한 매개 변수 에 따라 Public 와 비 Public 구조 기 를 얻 습 니 다.
Constructor[]getDeclared Constructors()/public 의 모든 구조 기 획득
클래스 획득 방법 Method getMethod(String name,Class[]params),방법 명,매개 변수 유형 에 따라 획득 방법
Method[]getMethods()/모든 Public 방법 획득
Method getDeclared Method(String name,Class[]params)//방법 이름과 매개 변수 유형 에 따라 Public 와 비 Public 를 얻 는 방법
Method[]getDeclared Methods()//그래서 Public 와 비 Public 방법 을 얻 습 니 다.
클래스 속성 을 가 져 오 는 방법 Field getField(String name)//변수 명 에 따라 public 변 수 를 가 져 옵 니 다.
Field[]getFields()//클래스 에서 Public 를 얻 는 방법
Field getDeclared Field(String name)/방법 명 에 따라 Public 와 비 Public 변 수 를 가 져 옵 니 다.
Field[]getDeclared Fields()//클래스 의 모든 Public 와 비 Public 방법 을 얻 는 데 자주 사용 되 는 것 은 이것 입 니 다.이것 을 알 고 있 습 니 다.다른 것 은 모두 잘 됩 니 다....................................................................................그래서 서로 다른 시계 에 대해 서로 다른 dao 류 를 만 듭 니 다.이렇게 하면 개발 속도 가 높 을 뿐만 아니 라 코드 가 너무 많 습 니 다.가장 중요 한 것 은 차이 가 많 지 않 은 것 을 보고 직접 복사 하여 수정 하 는 것 입 니 다.각종 저급한 오 류 를 범 하기 쉽 기 때 문 입 니 다.
자바 반사 메커니즘 이 있 으 면 모든 것 이 잘 될 것 입 니 다.dao 류,네 가지 방법 만 쓰 고 삭제 하고 검사 하 며 서로 다른 대상 에 들 어가 면 OK 입 니 다.모든 표 에 dao 류 를 만 들 필요 가 없습니다.반사 체 제 는 자동 으로 우리 에 게 남 은 일 을 완성 하 는 것 을 도와 줄 것 입 니 다.이것 이 바로 그것 의 장점 입 니 다.말하자면 반사 체 제 는 우리 가 반복 되 는 규칙 적 인 일 을 하 는 것 을 전문 적 으로 도와 주 는 것 이다.그래서 현재 많은 자동 으로 코드 를 생 성 하 는 소프트웨어 는 반사 체 제 를 활용 하여 이 루어 진 것 이다.규칙 에 따라 관련 된 파 라 메 터 를 입력 하면 저급한 프로그래머 들 은 점점 지 워 진다.왜?코드 를 쓰 지 않 아 도 되 기 때문에 아무 나 개발 할 수 있 는데 프로그래머 는 뭘 해 야 합 니까?그래서 우 리 는 오직 한 가지 출 로 만 있다.그것 은 바로 노력 하고 노력 하 며 고급 프로그래머 가 되 어 바보 소프트웨어 를 전문 적 으로 개발 하여 다른 프로그래머 들 에 게  저리 가 시원 하 게,하하~
6.반사 체제 로 데이터 베이스 데이터 에 대한 증가,사례 조사 기본 원 리 를 실현 한다.데 이 터 를 저장 할 때 저장 해 야 할 대상 의 속성 값 을 모두 꺼 내 sql 문 구 를 맞 춰 조회 할 때 조회 한 데 이 터 를 모두 자바 대상 으로 포장 합 니 다.게임 규칙:속담 에 이 르 기 를 규칙 이 없 으 면 사각형 이 되 지 않 는 다 고 했 습 니 다.특히 프로그램 에 서 는 규칙 이 있 는 일 만 할 수 있 고 규칙 이 없 으 면 할 수 없습니다.좋 습 니 다.그러면 먼저 규칙 1)데이터 뱅 크 의 모든 표 대상 은 하나의 pojo 류 이 고 표 의 모든 필드 는 pojo 류 의 속성 에 대응 합 니 다.또한 pojo 류 의 이름과 표 의 이름 이 같 고 속성 명 과 필드 이름 이 같 으 며 대소 문 자 는 관계 가 없습니다.데이터 베 이 스 는 일반적으로 대소 문 자 를 구분 하지 않 기 때 문 입 니 다.  2)pojo 류 의 모든 속성 에 표준 set 와 get 방법 을 추가 합 니 다.게임 규칙 이 생 겼 으 니 게임 을 시작 합 시다.
1.우선 데이터베이스 에 표 가 있 습 니 다.데이터베이스 이름 을 blogsystem 이 라 고 가정 하고 안에 있 는 표 이름 userinfo 입 니 다.그림:
2.해당 하 는 pojo 류 를 만 듭 니 다.

package cn.netjava.pojo;

public class UserInfo {
private int id;
private String name;
private String pwd;
private int age;

@Override
public String toString() {
    return "UserInfo [id=" + id + ", name=" + name + ", pwd=" + pwd + ", age="
            + age + "]";
}
public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getPwd() {
    return pwd;
}
public void setPwd(String pwd) {
    this.pwd = pwd;
}
public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}

}
2.데이터 베 이 스 를 연결 하 는 공장 류 를 작성 합 니 다.

package cn.netjava.factory;

import java.sql.Connection;
import java.sql.DriverManager;

public class Connect2DBFactory {
    public static Connection getDBConnection() {
        Connection conn = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/blogsystem";
            String user = "root";
            String password = "netjava";
            conn = DriverManager.getConnection(url, user, password);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return conn;
    }
}
3.좋 은 연극 이 시작 되 었 습 니 다.데이터 베 이 스 를 조작 하 는 dao 류

package cn.netjava.session;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import cn.netjava.factory.Connect2DBFactory;
import cn.netjava.pojo.UserInfo;

public class NetJavaSession {
    /**
     * sql
     *
     * @param object
     *            :
     * @return: sql
     */
    public static String getSaveObjectSql(Object object) {
        // sql
        String sql = "insert into ";
        //
        Class c = object.getClass();
        //
        Method[] methods = c.getMethods();
        //
        Field[] fields = c.getFields();
        //
        String cName = c.getName();
        //
        String tableName = cName.substring(cName.lastIndexOf(".") + 1,
                cName.length());
        sql += tableName + "(";
        List<String> mList = new ArrayList<String>();
        List vList = new ArrayList();
        for (Method method : methods) {
            String mName = method.getName();
            if (mName.startsWith("get") && !mName.startsWith("getClass")) {
                String fieldName = mName.substring(3, mName.length());
                mList.add(fieldName);
                System.out.println(" ----->" + fieldName);
                try {
                    Object value = method.invoke(object, null);
                    System.out.println(" :" + value);
                    if (value instanceof String) {
                        vList.add("\"" + value + "\"");
                        System.out.println(" ------>" + value);
                    } else {
                        vList.add(value);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        for (int i = 0; i < mList.size(); i++) {
            if (i < mList.size() - 1) {
                sql += mList.get(i) + ",";
            } else {
                sql += mList.get(i) + ") values(";
            }
        }
        for (int i = 0; i < vList.size(); i++) {
            if (i < vList.size() - 1) {
                sql += vList.get(i) + ",";
            } else {
                sql += vList.get(i) + ")";
            }
        }

        return sql;
    }

    public static List getDatasFromDB(String tableName, int Id) {

        return null;

    }

    /**
     *
     *
     * @param object
     *            :
     * @return: ;1: ,0:
     */
    public int saveObject(Object object) {
        Connection con = Connect2DBFactory.getDBConnection();
        String sql = getSaveObjectSql(object);
        try {
            // Statement statement=(Statement) con.createStatement();
            PreparedStatement psmt = con.prepareStatement(sql);
            psmt.executeUpdate();
            return 1;
        } catch (SQLException e) {
            e.printStackTrace();
            return 0;
        }
    }

    /**
     *
     *
     * @param arg0
     *            :
     * @param id
     *            : id
     * @return:
     */
    public Object getObject(String className, int Id) {
        //
        String tableName = className.substring(className.lastIndexOf(".") + 1,
                className.length());
        // Class
        Class c = null;
        try {
            c = Class.forName(className);

        } catch (ClassNotFoundException e1) {

            e1.printStackTrace();
        }
        // sql
        String sql = "select * from " + tableName + " where Id=" + Id;
        System.out.println(" sql :" + sql);
        //
        Connection con = Connect2DBFactory.getDBConnection();
        //
        Object obj = null;
        try {

            Statement stm = con.createStatement();
            //
            ResultSet set = stm.executeQuery(sql);
            //
            Method[] methods = c.getMethods();
            //
            while (set.next()) {
                obj = c.newInstance();
                //
                for (Method method : methods) {
                    String methodName = method.getName();
                    // set
                    if (methodName.startsWith("set")) {
                        //
                        String columnName = methodName.substring(3,
                                methodName.length());
                        //
                        Class[] parmts = method.getParameterTypes();
                        if (parmts[0] == String.class) {
                            // String , , set
                            method.invoke(obj, set.getString(columnName));
                        }
                        if (parmts[0] == int.class) {
                            method.invoke(obj, set.getInt(columnName));
                        }
                    }

                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return obj;
    }
}
4.테스트 효 과 는 어 떻 습 니까?

package cn.netjava.tester;

import cn.netjava.pojo.UserInfo;
import cn.netjava.session.NetJavaSession;

public class Tester {
    public static void main(String args[]) {
        // NetJavaSession
        NetJavaSession session = new NetJavaSession();
        // UserInfo
        UserInfo user = new UserInfo();
        //
        user.setId(6988);
        user.setAge(44);
        user.setPwd("pwd");
        user.setName("champion");
        //
        String sql = session.getSaveObjectSql(user);
        System.out.println(" sql :" + sql);
        //
        UserInfo userInfo = (UserInfo) session.getObject(
                "cn.netjava.pojo.UserInfo", 6988);
        System.out.println(" :" + userInfo);

    }
}
5.인쇄 된 결과:
7.전체적으로 보면 자바 반사 체 제 는 아주 좋 은 것 입 니 다.이 를 통 해 많은 죽은 것 을 해결 할 수 있 습 니 다.반사 체제 의 유연성 이 매우 크 기 때문에 그 가 있 으 면 우 리 는 데이터 베 이 스 를 만 드 는 코드 를 쓰 는 데 너무 많은 시간 을 들 이지 않 고 방법 이 더 많은 시간 을 프로젝트 의 논리 적 기능 에서 이것 은 개발 시간 을 크게 줄 일 수 있 습 니 다.그리고 코드 의 가 독성 이 좋 습 니 다.먼저 있 는 많은 오픈 소스 프레임 워 크 는 모두 사용 하 는 반사 메커니즘 으로 파일 을 설정 한 다음 에 규칙 에 따라 그의 방법 을 호출 하면 된다.

좋은 웹페이지 즐겨찾기