类反射,用于JDBC

三种获取字节码对象的方法,获取的都是同一个,因为保存的对象只有一个

Student s = new Student();

Class  c1 = Student.class;

Class  c2 =s.getClass();

Class  c3 = Class.forName("com.test.reflector.Student");

重点是第三种获取对象的方法

例子的隐藏条件: 有一个Student类,构造方法  public Student(); private Student(String name);  public Student(String name,int age); 成员变量  public String name ; private int age;有get和set方法

public class Student {

    private String name;
    public int age;
    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    private Student(String name) {
        super();
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }

    public void play() {
        System.out.println("play");
    }

    public void play(String str) {
        System.out.println("play--"+str);
    }

}

注意:类反射能获取公有的构造方法  如果想要获取到私有的构造方法,就要使用getDeclaredConstructor,如果需要使用私有的构造方法,就要使用暴力访问constructor.setAccessible(true);

关于有参构造方法里面的参数列表怎么填,如果是字符串就String.class   如果是int型就用 int.class

Class  c3 = Class.forName("com.test.reflector.Student"); //相当于获取到学生类

创建对象  Student  stu = (Student) c3.newInstance();  //获取一个学生对象

获取字节码对象的无参构造  Constructor  constructor  = c3.getConstructor();   Student s = (Student)constructor.newInstance();

获取字节码对象的有参构造   Constructor  constructor  = c3.getConstructor(String.class,int.class);  Student s = (Student)constructor.newInstance("张三",“11”);

获取所有公有的构造方法    Constructor[] constructors  = c3.getConstructors();

获取所有包括私有的构造方法  Constructor[] constructors = c3.getDeclaredConstructors();

通过暴力访问使用私有构造方法

Constructor constructor = c3.getDeclaredConstructor(String.class);
constructor.setAccessible(true);  //设置暴力访问
Student s= (Student) constructor.newInstance("aaa"); //不设置暴力访问,编译不会出错,运行会报错

java.lang.IllegalAccessException: Class com.reflector.Demo01 can not access a member of class com.woniuxy.reflector.Student with modifiers "private"
 为公有成员赋值

1 Class c1 = Class.forName("com.reflector.Student");
2 Student s= (Student) c1.newInstance();
3 Field fieldAge = c1.getField("age");
4 //给学生对象s的age字段赋值位11
5 fieldAge.set(s, 11);  //参数列表(对象,要赋的值)

为私有成员赋值

1         Student s= (Student) c1.newInstance();
2         Field fieldName = c1.getDeclaredField("name");
3         fieldName.setAccessible(true);
4         //给学生对象s的私有字段name赋值
5         fieldName.set(s, "aaa");
6         System.out.println(s);

调用无参方法

1     Class c1 = Class.forName("com.reflector.Student");
2     Student s= (Student) c1.newInstance();
3     Method method = c1.getMethod("play"); //调用学生的无参方法play
4     method.invoke(s);  //输出这个对象的方法结果

调用有参方法

1         Class c1 = Class.forName("com.reflector.Student");
2         Student s= (Student) c1.newInstance();
3         Method method = c1.getMethod("play", String.class);
4         method.invoke(s, "aaa");  //要使用的对象 ,传递的参数

原文地址:https://www.cnblogs.com/19322li/p/10771744.html

时间: 2024-10-15 09:58:18

类反射,用于JDBC的相关文章

Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法

先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 2 的对应的属性赋值:属性即为 Map 的键,值即为 Map 的值. 使用 JDBC 驱动程序处理元数据 Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信

Java 类反射机制分析

一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某种机制来实现对自己行为的描述和检测,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 在Java中的反射机制,被称为Reflection.(大家看到这个单词,第一个想法应该就是去开发文档中搜一下了.)它允许运行中的Java程序对自身进行检查,并能直接操作程序的内部属性或方法.Reflection机制

JDBC学习笔记——利用反射及JDBC元数据编写通用的查询方法

我们的查询操作,对于不同的数据表examstudent和customers,会有不同的代码编写过程,利用反射和JDBC元数据可以编写通用的方法进行对不同数据表的查询. 在此之前我们是这样做的: 查询customers表中的字段以及字段值: 1 public Customer getCustomer(String sql, Object... args) { 2 Customer customer = null; 3 Connection connection = null; 4 Prepared

java高级值类反射

 类反射 类反射,这是属于java高级的技术了,如果把这个学好了,那么你的java学习之路就上了一个台阶了. 一.什么是类反射? 1.JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调           用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制. 2.反射(Reflection)是Java程序开发语言的特征之一,它允许运行中的Java程序对自身进行检查, 也称自审,并能直接操作

【转】JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法

转自:http://www.cnblogs.com/ysw-go/ JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 * 可以由Connection得到 */ 具体的应用代码: 1 @Test 2 public void testDatabaseMetaData(){ 3 Connection connection=null; 4 ResultSet resultSet=null; 5 try { 6 conne

java之 ------ 类反射【详解】

一.什么是类反射 ★JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动 态调用对象的方法的功能称为Java语言的反射机制. 反射(Reflection)是Java程序开发语言的特征之一,它允许运行中的Java程序对自身进行检查, 也称自审,并能直接操作程序的内部属性.例如,使用它能获得Java类中各成员的名 称并显示出来. Java的这一能力在实际应用中应用得很多,在其它的程序语言中根本就

JDBC课程5--利用反射及JDBC元数据(ResultSetMetaData)编写通用的查询方法

/**-利用反射及JDBC元数据编写通用的查询方法 * 1.先利用SQl语句进行查询,得到结果集--> * 2.查找到结果集的别名:id--> * 3.利用反射创建实体类的对象,创建author对象--> * 4.获取结果集的列的别名: id,nation,name * 5.再获得结果集的每一列的值, * 结合2得到一个map键值对: 键: 列的别名,值: 列的值: {id=1,nation=中国,name=莫言} * 6.再利用反射为2的对应的属性赋值,属性为Map 的键,值为Map

PHP自定义弹出消息类,用于弹出提示信息并返回

一个用PHP自写的弹出消息类,用于在程序出错时弹出提示,,弹出警告框,或在程序运行到某阶段的快捷提示,需用时只需传入参数即可,函数并不复杂,但觉得挺实用.具体代码: function Alert($alert,$goback=0){ if($I_goback<>0){ echo "<script>alert('$alert');history.go($goback);</script>"; }else{ echo "<script&g

javaEE之-----------类反射直接封装前台传过来的参数

在JavaEE  WEB中,我们收集form表单传过来的数据,通常是采用值对象的方式,一一去获取,封装,然后将值对象传到后台进行使用. 如: <span style="font-size:18px;"> String name=request.getParameter("name"); String pwd=request.getParameter("pwd"); String id =request.getParameter(&qu