Skip to content

Commit be79ffa

Browse files
authored
Inspector: restore private field access (#201)
Fixes an oversight made in #197
1 parent a0e0ae2 commit be79ffa

File tree

5 files changed

+55
-11
lines changed

5 files changed

+55
-11
lines changed

.circleci/config.yml

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,42 +14,39 @@ defaults: &defaults
1414
env_defaults: &env_defaults
1515
LEIN_ROOT: "true" # we intended to run lein as root
1616

17-
jdk8_env_defaults: &jdk8_env_defaults
17+
jdk_env_defaults: &jdk_env_defaults
1818
JVM_OPTS: -Xmx3200m -Dclojure.main.report=stderr
1919

20-
newer_jdk_env_defaults: &newer_jdk_env_defaults
21-
JVM_OPTS: -Xmx3200m --illegal-access=deny -Dclojure.main.report=stderr
22-
23-
# Runners for OpenJDK 8 and 11
20+
# Runners for each major OpenJDK
2421

2522
executors:
2623
openjdk8:
2724
docker:
2825
- image: circleci/clojure:openjdk-8-lein-2.9.1
2926
environment:
3027
<<: *env_defaults
31-
<<: *jdk8_env_defaults
28+
<<: *jdk_env_defaults
3229
<<: *defaults
3330
openjdk11:
3431
docker:
3532
- image: circleci/clojure:openjdk-11-lein-2.9.1
3633
environment:
3734
<<: *env_defaults
38-
<<: *newer_jdk_env_defaults
35+
<<: *jdk_env_defaults
3936
<<: *defaults
4037
openjdk16:
4138
docker:
4239
- image: circleci/clojure:openjdk-16-lein-2.9.5-buster
4340
environment:
4441
<<: *env_defaults
45-
<<: *newer_jdk_env_defaults
42+
<<: *jdk_env_defaults
4643
<<: *defaults
4744
openjdk17:
4845
docker:
4946
- image: circleci/clojure:openjdk-17-lein-2.9.5-buster
5047
environment:
5148
<<: *env_defaults
52-
<<: *newer_jdk_env_defaults
49+
<<: *jdk_env_defaults
5350
<<: *defaults
5451

5552
# Runs a given set of steps, with some standard pre- and post-

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
### Bugs fixed
66

77
* `orchard.inspect`: don't render `Datafy` sections identical to the data they refer to, for nil-valued maps.
8+
* `orchard.inspect`: access private fields again.
9+
* This feature was accidentally dropped in the previous release.
810

911
## 0.17.0 (2023-10-24)
1012

src/orchard/inspect.clj

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,11 @@
626626
(try
627627
(.get f obj)
628628
(catch Exception _
629-
::access-denied)))
629+
(try
630+
(.setAccessible f true)
631+
(.get f obj)
632+
(catch Exception _
633+
::access-denied)))))
630634

631635
(defmethod inspect :default [inspector obj]
632636
(let [class-chain (loop [c (class obj), res ()]
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package orchard.java;
2+
3+
public class PrivateFieldClass {
4+
5+
public PrivateFieldClass(int age){
6+
this.age = age;
7+
}
8+
9+
private final int age;
10+
11+
}

test/orchard/inspect_test.clj

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
[orchard.misc :refer [datafy? java-api-version tap?]]
1515
[orchard.misc :as misc])
1616
(:import
17-
(java.io File)))
17+
(java.io File)
18+
(orchard.java PrivateFieldClass)))
1819

1920
;; for `match?`
2021
(require 'matcher-combinators.test)
@@ -1036,3 +1037,32 @@
10361037
(is (nil? (datafy-section rendered))))
10371038
(let [rendered (-> {:foo :bar :nilable nil} inspect render)]
10381039
(is (nil? (datafy-section rendered))))))
1040+
1041+
(deftest private-field-access-test
1042+
(testing "Inspection of private fields is attempted (may fail depending on the JDK and the module of the given class)"
1043+
(if (< java-api-version 16)
1044+
(do
1045+
(is (nil? (->> 2 inspect render (section "Private static fields"))))
1046+
(is (match? (matchers/embeds [(list :value "serialVersionUID" number?)])
1047+
(->> 2 inspect render (section "Static fields")))))
1048+
1049+
(let [rendered (->> 2 inspect render (section "Private static fields"))]
1050+
(is (match? (list "--- Private static fields:"
1051+
'(:newline)
1052+
" "
1053+
(list :value "serialVersionUID" number?)
1054+
" = "
1055+
(list :value "<non-inspectable value>" number?)
1056+
'(:newline))
1057+
rendered))))
1058+
1059+
(let [rendered (->> (PrivateFieldClass. 42) inspect render (section "Instance fields"))]
1060+
(is (match? (list "--- Instance fields:"
1061+
'(:newline)
1062+
" "
1063+
(list :value "age" number?)
1064+
" = "
1065+
(list :value "42" number?)
1066+
'(:newline))
1067+
rendered)
1068+
"Fully inspects private fields for a class that is module-accessible"))))

0 commit comments

Comments
 (0)